Как я могу разделить большой 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
Большое спасибо!
Вы можете использовать метод 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:
Объяснение цикла мы используем:
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
просто циклически перебирайте идентификаторы, создайте нарезанный кадр данных для каждого и создайте файл .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)
Без использования 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()