#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. Этого не понял. Любой пример?