【问题标题】:Save data frame from inside for loop从 for 循环内部保存数据帧
【发布时间】:2019-10-09 04:25:30
【问题描述】:

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

到目前为止,一切顺利。

现在我想在for 循环中为dataframe 中的每一列使用函数transforming_data(因为我有很多列,而不仅仅是两列)并将生成的数据框保存到一个新的数据框,例如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 并没有谈到实际保存数据框,所以它对我没有帮助。

【问题讨论】:

    标签: python pandas loops for-loop


    【解决方案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')
    ]
    

    【讨论】:

      【解决方案2】:

      如果您想将循环中的所有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
      

      如果“保存”是指“写入磁盘”,那么您可以使用 pandas 提供的众多 to_<file_format>() 方法之一:

      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() docs

      【讨论】:

        猜你喜欢
        • 2021-09-22
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 2020-04-04
        • 2022-01-02
        • 1970-01-01
        • 1970-01-01
        • 2014-06-06
        相关资源
        最近更新 更多