Создание фрейма данных из списка файлов с разными столбцами целевого класса

#python #pandas #dataframe #text

#python #pandas #фрейм данных #текст

Вопрос:

У меня есть список текстовых файлов:

 ['datasets/Autobiography.txt',
 'datasets/CoralReefs.txt',
 'datasets/DescentofMan.txt',
 'datasets/DifferentFormsofFlowers.txt',
 'datasets/EffectsCrossSelfFertilization.txt']
 

Все они имеют столбцы «текст» и «метки», причем «метки» имеют 2 класса (да / нет).

Я создаю фрейм данных со всеми именами файлов и их соответствующей информацией.

Например, я извлекаю, сколько строк в каждом файле:

 rows = []
for i in files:
    rows.append(i.shape[0])
 

Затем я создаю фрейм данных с именем файла и примечаниями.

 df = pd.DataFrame.from_dict(dict(file_name=files_list, notes_number=rows))
 

Я также хочу поместить класс метки (да / нет) в разные столбцы вместе с именами файлов.

 file_name  notes_number   yes   no
 AAAA.txt      100        50    50
 BBBB.txt      200        100   100
 

Как этого можно достичь?

Ответ №1:

Похоже, у вас уже есть большая часть решения. Спасибо, что написали такой хороший вопрос!

Я также хочу поместить класс метки (да / нет) в разные столбцы вместе с именами файлов.

Вы можете сделать это с помощью Series.value_counts() .

 df = pd.DataFrame.from_dict(dict(file_name=files_list, notes_number=rows))
 

Когда я итеративно создаю фрейм данных, мне нравится использовать список словарей. Я считаю, что это легче читать, чем словарь списков. Это также более эффективно, чем добавление строки за раз к фрейму данных. Вот как я бы сделал то, что вы предлагаете:

 import pandas as pd
import random

filenames = ['foo.csv', 'foo2.csv']
summaries = []

for file in filenames:
    df = pd.read_csv(file)
    counts = df['labels'].value_counts()
    summary = {
        'filename': file,
        'notes_number': df.shape[0],
        'yes': counts['yes'],
        'no': counts['no'],
    }
    summaries.append(summary)

summaries = pd.DataFrame(summaries)
print(summaries)
 

Что дает этот результат:

    filename  notes_number  yes  no
0   foo.csv           100   52  48
1  foo2.csv            70   36  34
 

Редактировать: если вы хотите поддерживать несколько типов меток, вот как изменить пример:

 import pandas as pd
import random

filenames = ['foo.csv', 'foo2.csv']
summaries = []

for file in filenames:
    df = pd.read_csv(file)
    summary = {
        'filename': file,
        'notes_number': df.shape[0],
    }
    # Add value counts to summary
    counts = df['labels'].value_counts()
    summary.update(counts.to_dict())
    summaries.append(summary)

summaries = pd.DataFrame(summaries)
# Fill in missing values
summaries = summaries.fillna(0)
print(summaries)
 

Это приводит к следующему результату:

    filename  notes_number  yes  no  maybe
0   foo.csv           100   51  48    1.0
1  foo2.csv            70   36  34    0.0
 

Класс ‘maybe’ существует в foo.csv, но не в foo2.csv, но мы можем заполнить недостающее значение fillna(0) строкой.

Комментарии:

1. Привет @Nick-Odell. Это действительно разумный способ создания фрейма данных. Спасибо 🙂 Я хотел бы знать еще одну вещь — если у меня более 2 классов, и они тоже отличаются от файла к файлу, в этом случае, как я могу перебирать файлы и создавать столбцы целевого класса с этими классами?

2. Вы имеете в виду, что в столбце labels есть несколько значений или что у вас есть несколько столбцов, из которых вы хотите получить значения?

3. В столбце labels есть несколько значений, и их число отличается от файла к файлу.

4. @Roy Вы можете преобразовать количество значений в dict и включить их в новый фрейм данных. См. Редактирование.

5. Этого не понял. Любой пример?