Pandas:处理值后提取索引和列

时间:2017-10-04 13:00:08

标签: python pandas dataframe jupyter

我有DF1,类似于:

    A            B
X   BLA, FOO     XY, ZY, DW     
Y   BAR, BLA     FOO, DW
Z   UVH, DD      RATM,QOTA

DF的每个元素都是一个具有以下结构的字符串:BLA, FOO, BAR, ...。我想根据单个元素将其重新整理为DF2,将其转换为XA的关联:

       A        B
BLA    X, Y
FOO    X        Y
XY              X
...

如您所见,DF1的每个元素都显示了索引和列之间的关联。有没有更实际的方法来逐行和逐列读取?或者,您如何从index获得columnpd.DF.applymap()

提前致谢

1 个答案:

答案 0 :(得分:4)

使用:

  • 为每列创建DataFrame splitstack
  • stack重塑系列 - 所有拆分值都在一列
  • MultiIndex
  • reset_index转换为列
  • 按唯一MultiIndex的重复项对进行分组,对重复项进行汇总join
  • 重塑unstack
  • 数据清理 - rename_axis
  • 列和索引名称
df1 = (df.apply(lambda x: x.str.split(',\s+', expand=True).stack())
       .stack()
       .reset_index(drop=True, level=1)
       .reset_index(name='val')
       .groupby(['val','level_1'])['level_0']
       .apply(', '.join)
       .unstack(fill_value='')
       .rename_axis(None)
       .rename_axis(None, 1))

谢谢,Zero提供类似解决方案:

df1 = (df.stack()
        .str.split(', ', expand=True)
        .stack()
        .reset_index(name='val')
        .groupby(['val','level_1'])['level_0']
        .apply(', '.join)
        .unstack(fill_value='')
        .rename_axis(None)
        .rename_axis(None, 1))
print (df)
         A     B
BAR      Y      
BLA   X, Y      
DD       Z      
DW          X, Y
FOO      X     Y
QOTA           Z
RATM           Z
UVH      Z      
XY             X
ZY             X
df1 = (df.stack()
        .str.split(', ', expand=True)
        .stack()
        .reset_index()
        .pivot_table(index=0, 
                     columns='level_1', 
                     values='level_0', 
                     aggfunc=','.join, 
                     fill_value='')
        .rename_axis(None)
        .rename_axis(None, 1))