В столбце есть 50+ разных уровней, и каждый уровень должен быть разбит на его собственный фрейм данных и записан в файл (Excel или CSV).
Я видел это как возможное решение:
df1, df2, df3, df4 = [x for _, x in df.groupby(df['column_of_interest'])]
но есть ли способ не жестко кодировать количество кадров данных?
Есть ли способ не жестко кодировать количество кадров данных?
Да, есть. Используйте словарь или список. Используя dict
:
dfs = {i: x for i, (_, x) in enumerate(df.groupby('column_of_interest'), 1)}
Затем получите доступ к вашим фреймам данных через dfs[1]
, dfs[2]
и т.д.
В качестве альтернативы, используя list
:
dfs = [x for _, x in df.groupby('column_of_interest')]
Затем используйте dfs[0]
, dfs[1]
и т.д.
Если вам не нужно хранить фрагменты данных, просто groupby
объект groupby
и используйте to_csv
. Это удобно для f-строк (PEP 498, Python 3. 6+):
for idx, (value, x) in enumerate(df.groupby('column_of_interest'), 1):
x.to_csv(f'slice_{value}.csv') # include value in filename
x.to_csv(f'slice_{idx}.csv') # include numeric index in filename
Вы можете сохранить данные непосредственно
[df1.to_csv("coi_%s.csv"%val) for val, df1 in df.groupby(df['column_of_interest'])]
Или с явным для цикла
for val, df1 in df.groupby(df['column_of_interest']):
#Write the df1 to csv or excel
df1.to_csv("coi_%s.csv"%val)
Один из способов сделать это с помощью locals
но не рекомендовать, лично подумать, что jpp answer - это правильный путь для этого типа запроса.
variables = locals()
for key,value in df.groupby(df['column_of_interest']):
variables["df{0}".format(key)]= value