Создайте новый фрейм данных для каждого уровня фактора в столбце - PullRequest
0 голосов
/ 09 января 2019

В столбце имеется более 50 различных уровней, и каждый уровень должен быть разбит на собственный фрейм данных и записан в файл (Excel или CSV).

Я видел это как возможное решение:

df1, df2, df3, df4 = [x for _, x in df.groupby(df['column_of_interest'])]

но есть ли способ не жестко кодировать количество кадров данных?

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Вы можете сохранить данные напрямую

[df1.to_csv("coi_%s.csv"%val) for val, df1 in df.groupby(df['column_of_interest'])]

Или с явным циклом for

for val, df1 in df.groupby(df['column_of_interest']):
    #Write the df1 to csv or excel
    df1.to_csv("coi_%s.csv"%val)
0 голосов
/ 09 января 2019

Один способ может сделать это, используя locals, но не рекомендуется, лично думайте, что ответ jpp - правильный путь для этого типа запроса.

variables = locals()
for key,value in df.groupby(df['column_of_interest']):
    variables["df{0}".format(key)]= value
0 голосов
/ 09 января 2019

Есть ли способ не жестко кодировать количество кадров данных?

Да, есть. Используйте словарь или список. Использование 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 и используйте 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
...