【问题标题】:Split Multilevel dataframe into different csv files将多级数据帧拆分为不同的 csv 文件
【发布时间】:2018-02-20 03:14:23
【问题描述】:

假设我有以下数据框:

    X       Y
   ---+---+---+---
    A | B | A | B
--+---+---+---+---
0 | 1 | 2 | 3 | 4
1 | 5 | 6 | 7 | 8
2 | 9 | 10| 11| 12

我想根据多级索引递归拆分它,并将它们保存在一个csv文件中。

例如,文件名 X_A.csv 应包含以下数据框:

    X 
   ---
    A 
--+---
0 | 1 
1 | 5 
2 | 9 

同样,文件 X_B.csv 应该将数据框存储为:

    X 
   ---
    B 
--+---
0 | 2 
1 | 6 
2 | 10

Y_A 和 Y_B 以此类推。

我正在寻找一种 Pythonic(或高效)的方法来执行此操作,而不是单独迭代列值,因为代码非常大。我尝试通过删除列级别并存储各个列来使用mentioned here 技术,但我希望这样我不必明确提及列名,因为数据框可能会扩展(即在最顶部级别可能有 4 列,例如 W、X、Y 和 Z)。

【问题讨论】:

  • 为什么不将两个级别的列名合并为一个
  • 如果panda.Dataframe subclass numpy.Ndarray,你不能在上面使用numpy indexing 选择你感兴趣的列,然后使用对象的方法导出到CSV
  • @Wen 我不想改变原来的 df 这就是为什么我不想合并两个级别的列名。

标签: python pandas dataframe multi-index


【解决方案1】:

选项 1

重命名df.columns

df.columns = ['_'.join(x) for x in df.columns]

df

   X_A  X_B  Y_A  Y_B
0                    
0    1    2    3    4
1    5    6    7    8
2    9   10   11   12

for c in df:
     df[c].reset_index().to_csv(c + '.csv')

选项 2

groupby 等级

for name, g in df.groupby(level=[0, 1], axis=1):
    g.to_csv('{0}_{1}.csv'.format(*name))

【讨论】:

    【解决方案2】:
    list_of_df = [df[i].to_frame() for i in df.columns]
    

    @JohnGalt 对 csv 的建议:

    _ = [df[i].to_frame().to_csv('{0}_{1}'.format(*i)) for i in df.columns]
    

    输出:

    list_of_df[0]

       X
       A
    0  1
    1  5
    2  9
    

    list_of_df[1]

        X
        B
    0   2
    1   6
    2  10
    

    ...

    list_of_df[3]

        Y
        B
    0   4
    1   8
    2  12
    

    【讨论】:

    • 整洁和 ...to_csv('{0}_{1}.csv'.format(*i)) 用于 csv。
    【解决方案3】:

    您可以为此使用简单的apply

    创建示例df:

    import pandas as pd
    import numpy as np
    
    index = pd.MultiIndex(levels=[['X', 'Y'], ['A', 'B']],labels=[[0, 0, 1, 1], [0, 1, 0, 1]])
    df = pd.DataFrame(columns=index, data=np.arange(12).reshape((3, 4)))
    
    >>> df
    Out[]:
       X      Y
       A  B   A   B
    0  0  1   2   3
    1  4  5   6   7
    2  8  9  10  11
    

    另存为单独的 CSV 文件:

    df.apply(lambda x: x.to_csv('_'.join(x.name) + '.csv'), axis=0)
    

    这将产生所需的输出。例如X_A.csv 包含:

    0,0
    1,4
    2,8
    

    如果要将轴名称包含在 csv 中,请将 header=True 作为参数添加到 to_csv,然后 X_A.csv 将包含:

    ,X
    ,A
    0,0
    1,4
    2,8
    

    【讨论】:

      猜你喜欢
      • 2017-11-21
      • 1970-01-01
      • 2013-11-16
      相关资源
      最近更新 更多