У меня есть функция, которая принимает dataframe и возвращает (уменьшенный) dataframe, например. так:
def transforming_data(dataframe, col_1, col_2, normalized = True):
''' takes in dataframe, groups col_1 according to col_2 and returns dataframe
'''
df = dataframe[col_1].groupby(dataframe[col_2]).value_counts(normalize = normalized).unstack(fill_value = 0)
return dataframe
Для следующего кода это дает мне:
import pandas as pd
import numpy as np
np.random.seed(12)
def transforming_data(df, col_1, col_2, normalized = True):
''' takes in df, groups col_1 according to col_2 and returns df '''
df = dataframe[col_1].groupby(dataframe[col_2]).value_counts(normalize = normalized).unstack(fill_value = 0)
return df
numrows = 1000
dataframe = pd.DataFrame({'Numerical': np.random.randn(numrows),
'Category': np.random.choice(['Panda', 'Elephant', 'Anaconda'], numrows),
'Response 1': np.random.choice(['Yes', 'Maybe', 'No', 'Don\'t know'], numrows),
'Response 2': np.random.choice(['Very Much', 'Much', 'A bit', 'Not at all'], numrows)})
test = transforming_data(dataframe, 'Response 1', 'Category')
print(test)
# Output
# Response 1 Don't know Maybe No Yes
# Category
# Anaconda 0.275229 0.232416 0.217125 0.275229
# Elephant 0.220588 0.270588 0.255882 0.252941
# Panda 0.258258 0.222222 0.273273 0.246246
Все идет нормально.
Теперь я хочу использовать функцию transforming_data внутри цикла for для каждого столбца в dataframe (поскольку у меня много столбцов, а не только два) и сохранить полученный фрейм данных в новый фрейм данных, например. test_response_1 и test_response_2 для этого примера.
Может ли кто-нибудь указать мне правильное направление - т.е. как правильно реализовать цикл?
До сих пор я использую что-то вроде этого, но не могу понять, как спасти фрейм данных
for column in dataframe.columns.tolist():
temp_df = transforming_data(dataframe, column, 'Category')
# here, I need to save tmp_df outside of the loop but don't know how to
Большое спасибо за указатели и помощь. (Примечание: самый похожий вопрос, который я нашел не говорит о фактическом сохранении фрейма данных, поэтому мне это не поможет.






Самым простым решением было бы сохранить кадры данных результатов в список. Предполагая, что все столбцы, которые вы хотите перебрать, имеют текст Response в имени столбца:
result_dframes = []
for col_name in dataframe.filter(like='Response').columns:
result_dframe = transforming_data(dataframe, col_name, 'Category')
result_dframes.append(result_dframe)
В качестве альтернативы вы также можете получить точно такой же результат с помощью понимание списка вместо цикла for:
result_dframes = [
transforming_data(dataframe, col_name, 'Category')
for col_name in dataframe.filter(like='Response')
]
Если вы хотите сохранить (в памяти) все temp_df из вашего цикла, вы можете добавить их в список, который затем можно проиндексировать:
temp_dfs = []
for column in dataframe.columns.tolist(): #you don't actually need the tolist() method here
temp_df = transforming_data(dataframe, column, 'Category')
temp_dfs.append(temp_df)
Если вы предпочитаете иметь доступ к этим temp_df по имени столбца, который использовался для их преобразования, вы можете назначить каждый словарь, используя столбец в качестве ключа:
temp_dfs = {}
for column in dataframe.columns.tolist():
temp_df = transforming_data(dataframe, column, 'Category')
temp_dfs[column] = temp_df
Если под «сохранить» вы имели в виду «записать на диск», то вы можете использовать один из многих методов to_<file_format>(), которые предоставляет pandas:
temp_dfs = {}
for column in dataframe.columns.tolist():
temp_df = transforming_data(dataframe, column, 'Category')
temp_df.to_csv('temp_df{}.csv'.format(column))
Вот to_csv()документы.