【问题标题】:dataframe into dictionary of dataframes based on one column将数据框转换为基于一列的数据框字典
【发布时间】:2018-07-27 04:45:36
【问题描述】:

我有一个如下所示的数据框:

df=
         column1  v1   v2 ... vN
ind1     'a'      1    3
ind1     'b'      2    4
ind2     'a'      3    5
ind2     'b'      4    6
...
indN     'c'      5    7

我想将此数据框拆分为一个数据框字典,每个原始 v1..vN 列都有一个,并将 column1 中的可能值作为新列

例如

output['v1']=
      'a'    'b'     'c'
ind1   1      2      nan
ind2   3      4       nan
indN   nan   nan       5
output['v2']=
      'a'    'b'     'c'
ind1   3      4      nan
ind2   5      6       nan
indN   nan   nan       7

并用nans 填补任何空白。

【问题讨论】:

    标签: python pandas dataframe pivot-table pandas-groupby


    【解决方案1】:

    set_indexunstack 一起使用:

    df1 = df.set_index('column1', append=True).unstack()
    print (df1)
              v1             v2          
    column1  'a'  'b'  'c'  'a'  'b'  'c'
    ind1     1.0  2.0  NaN  3.0  4.0  NaN
    ind2     3.0  4.0  NaN  5.0  6.0  NaN
    indN     NaN  NaN  5.0  NaN  NaN  7.0
    

    然后在字典理解中通过MultiIndex 的第一级选择xs

    output = {x:df1.xs(x, axis=1) for x in df1.columns.levels[0]}
    print (output)
    {'v2': column1  'a'  'b'  'c'
    ind1     3.0  4.0  NaN
    ind2     5.0  6.0  NaN
    indN     NaN  NaN  7.0, 'v1': column1  'a'  'b'  'c'
    ind1     1.0  2.0  NaN
    ind2     3.0  4.0  NaN
    indN     NaN  NaN  5.0}
    
    print (output['v1'])
    column1  'a'  'b'  'c'
    ind1     1.0  2.0  NaN
    ind2     3.0  4.0  NaN
    indN     NaN  NaN  5.0
    

    但也可以通过xsdf1 生成输出而无需理解:

    print (df1.xs('v1', axis=1))
    column1  'a'  'b'  'c'
    ind1     1.0  2.0  NaN
    ind2     3.0  4.0  NaN
    indN     NaN  NaN  5.0
    

    类似的解决方案:

    df1 = df.set_index('column1', append=True)
    print (df1)
                  v1  v2
         column1        
    ind1 'a'       1   3
         'b'       2   4
    ind2 'a'       3   5
         'b'       4   6
    indN 'c'       5   7
    
    output = {x:df1.unstack().xs(x, axis=1) for x in df1.columns}
    print (output)
    {'v2': column1  'a'  'b'  'c'
    ind1     3.0  4.0  NaN
    ind2     5.0  6.0  NaN
    indN     NaN  NaN  7.0, 'v1': column1  'a'  'b'  'c'
    ind1     1.0  2.0  NaN
    ind2     3.0  4.0  NaN
    indN     NaN  NaN  5.0}
    
    print (output['v1'])
    column1  'a'  'b'  'c'
    ind1     1.0  2.0  NaN
    ind2     3.0  4.0  NaN
    indN     NaN  NaN  5.0
    

    【讨论】:

      猜你喜欢
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2022-07-05
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      相关资源
      最近更新 更多