从内部保存数据框以进行循环

时间:2019-05-22 16:03:51

标签: python pandas loops for-loop

我有一个函数,它接受一个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_1test_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

非常感谢您提供指导和帮助。 (请注意:most similar question I found并未讨论实际保存数据帧,因此对此无济于事。

2 个答案:

答案 0 :(得分:1)

最简单的解决方案是将结果数据帧保存到列表中。假设您要循环的所有列的列名中都包含文本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)

或者,您也可以使用list comprehension而不是for循环来获得完全相同的结果:

result_dframes = [
    transforming_data(dataframe, col_name, 'Category')
    for col_name in dataframe.filter(like='Response')
]

答案 1 :(得分:1)

如果您要保存循环中的所有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()

这里是when (nextTile) { is Floor -> walk() is Wall -> block() is Trap -> Trap() is Door -> unlock() else -> throw IllegalArgumentException("Unknown expression") } docs