разбить большой CSV на основе одного условия столбца и записать в меньший CSV

1

Как я могу разделить большой CSV со многими столбцами, основываясь на изменении одного столбца, например, ID? вот пример:

import pandas as pd
from pandas.compat import StringIO
csvdata = StringIO("""ID,f1
1,3.2
1,4.3
1,10
7,9.1
7,2.3
7,4.4
""") 

df = pd.read_csv(csvdata, sep=",")
df

Моя цель - сохранить каждый блок в отдельном csv, имя которого генерируется в цикле на основе идентификатора:

df_ID_1.csv

    ID f1
    1  3.2
    1  4.3
    1  10.0

df_ID_7.csv

    ID f1
    7  9.1
    7  2.3
    7  4.4

Большое спасибо!

Теги:
pandas

3 ответа

1

Вы можете использовать метод groupby для этого и получить доступ к каждой отдельной группе и записать ее в CSV- pandas.to_csv используя pandas.to_csv.

for _, r in df.groupby('ID'):
    r.to_csv(f'df_ID_{r.ID.iloc[0]}')

Или, если ваша версия Python <3.5, используйте .format для форматирования строки вместо f-string:

for _, r in df.groupby('ID'):
    r.to_csv('df_ID_{}.csv'.format(r.ID.iloc[0]))

Который разбивает наш фрейм данных на отдельные CSV:
Изображение 174551

Объяснение цикла мы используем:

for _, r in df.groupby('ID'):
    print(r, '\n')
    print(f'This is our ID {r.ID.iloc[0]}', '\n')

   ID    f1
0   1   3.2
1   1   4.3
2   1  10.0 

This is our ID 1 

   ID   f1
3   7  9.1
4   7  2.3
5   7  4.4 

This is our ID 7 
1

просто циклически перебирайте идентификаторы, создайте нарезанный кадр данных для каждого и создайте файл .csv

for id in df['ID'].unique():
    temp_df = df.loc[df['ID'] == id]
    file_name = "df_ID_{}".format(id)
    # make the path to where you want it saved
    file_path = "C:/Users/you/Desktop/" + file_name
    # write the single ID dataframe to a csv
    temp_df.to_csv(file_path)
0

Без использования Pandas: чтение файла, сортировка по указанному столбцу, группировка по указанному столбцу, запись новых файлов.

import itertools, csv

key = operator.itemgetter('ID')
# assumes csvdata is a filelike object (io.StringIO in OP example)
reader = csv.DictReader(csvdata)
fields = reader.fieldnames
data = sorted(reader, key = key)
for key,group in itertools.groupby(data, key):
    with open(f'ID_{key}.csv', 'w')as f:
        writer = csv.DictWriter(f, fields)
        writer.writeheader()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню