【问题标题】:pandas: melt 100+ variables into 100+ new dataframespandas:将 100 多个变量融合到 100 多个新数据帧中
【发布时间】:2020-12-02 19:04:34
【问题描述】:

stackoverflow 的新手,如果格式看起来很奇怪,请多多包涵..

我有一大组数据,其中包含 100 多列数据,其结构如下:

countrya countryb 年份 variable1 variable2 ...... variable100

我想将 100 个变量分成 100 个新数据帧并将它们保存到 csvs 中。

以下是我用于创建 1 个新 csv 的代码。

dfm1=pd.melt(df, id_vars=['countrya','countryb','year'], value_vars=['variable1'],
         value_name='variable1')
dfm1.drop('variable',axis=1)
dfm1.to_csv('newdf1.csv')

如何实现流程自动化? 谢谢!

【问题讨论】:

    标签: python pandas automation melt


    【解决方案1】:

    您可以对所有变量使用 for 循环,并在其中调用您的函数(假设您的示例代码是正确的)

    def split(df, variable_name):
      dfm1=pd.melt(df, id_vars=['countrya','countryb',variable_name], value_vars=[variable_name], value_name=variable_name)
      dfm1.drop('variable',axis=1) # I don't know what's this line used for
      dfm1.to_csv('newdf_{}.csv'.format(variable_name))
    
    for variable_name in ['variable1', 'variable2']:
      split(df, variable_name)
    

    【讨论】:

    • 当我融化 df 时,它给了我一个“变量”列,其中包含我的变量名的所有相同值。 dfm1.drop('variable',axis=1) 是删除'variable'列。尝试运行它并得到这个错误: ValueError: arrays must be all be same length
    【解决方案2】:

    这是一种方法。首先,创建数据框。

    import pandas as pd
    
    df = pd.DataFrame({
        'country_a': [1, 2, 3],
        'country_b': [4, 5, 6],
        'year': [2018, 2019, 2020],
        'var_a': ['a', 'b', 'c'],
        'var_b': ['x', 'y', 'z']
    })
    
    print(df)
       country_a  country_b  year var_a var_b
    0          1          4  2018     a     x
    1          2          5  2019     b     y
    2          3          6  2020     c     z
    

    其次,使用您的列名遍历字段。

    base_fields = df.columns[:3].to_list()    # columns in every file
    var_fields = df.columns[3:]               # var_a, var_b, ...
    
    for var_field in var_fields:
        file_name = f'{var_field}.csv'
        with open(file_name, 'wt') as handle:
            fields = base_fields + [var_field]
            df.loc[:, fields].to_csv(handle)
            
            print(f'wrote {fields} to {file_name}')
    
    
    wrote ['country_a', 'country_b', 'year', 'var_a'] to var_a.csv
    wrote ['country_a', 'country_b', 'year', 'var_b'] to var_b.csv
                                              ^              ^
                                              last field and file name change
    

    【讨论】:

    • 这完全解决了我的问题!非常感谢!!!!!!
    • 你介意我问一个后续问题吗?我正在尝试融化所有新的 CSV。我的融化代码是:table=pd.pivot_table(var_a, values='var_a', index=['countrya','countryb'],columns=['year']) table1=table.reset_index()。 rename_axis(None, axis=1)... 发现很难再次自动化该过程!
    • 请您将其作为一个新问题发布,并包括实际输入数据和所需输出? (评论似乎太复杂了。)。此 SO 帖子可能有助于创建输入数据:stackoverflow.com/a/30424537/13608599
    • 嗨,我在这个新问题中发帖:stackoverflow.com/questions/63601469/…
    • 嗨,我刚刚发布了我的解决方案 :)
    猜你喜欢
    • 2020-02-21
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2020-05-13
    • 2021-10-18
    • 2019-05-31
    • 2018-01-31
    • 1970-01-01
    相关资源
    最近更新 更多