首页 > 解决方案 > 熊猫:按组爆炸(重复)

问题描述

我有一个看起来像这样的df:

df = pd.DataFrame(data={
    'id': ["idx1"],
    'test_A': ["ABC", ],
    'test_B': ["X"],
    'test_C': ["ABC / XYZ"],
    'test_D': ["ABC / JKL / XYZ"]})

这是一行的示例,但有数千行。我想分解这四个“TEST”列中有多个值的每个值,即。我希望每个人都为每个相同的“测试”复制行,如果有很多(用“/”分隔)我也想复制。如果重复内容不包含任何内容,我想要一个“X”。

当然还有很多其他列,对于这些列的重复值无关紧要:它应该保持不变。我不知道如何解释它,但这里有一个我想要的输出示例,用于我提供的输入:

df = pd.DataFrame(data={
    'id': ["idx1", "idx1", "idx1"],
    'test_A': ["ABC", "X", "X"],
    'test_B': ["X", "X", "X"],
    'test_C': ["ABC", "XYZ", "X"],
    'test_D': ["ABC", "XYZ", "JKL"]})

标签: pythonpandas

解决方案


样本:

df = pd.DataFrame(data={
    'id': ["idx1", 'idx0'],
    'test_A': ["ABC",'SSD' ],
    'test_B': ["X", 'ABC / JKL / XYZ'],
    'test_C': ["ABC / XYZ", 'aa'],
    'test_D': ["ABC / JKL / XYZ", 'ABC / JKL']})

想法是先用 整形DataFrame.melt,然后使用Series.str.splitandDataFrame.explode和最后一次GroupBy.cumcount用于计数器,idx列用于排序,最后用DataFrame.set_indexand整形Series.unstack

df1 = df.melt('id', ignore_index=False)
df1['value'] = df1['value'].str.split(' / ')
df1 = df1.explode('value').rename_axis('idx').reset_index()
g = df1.groupby(['idx','id','variable']).cumcount()

df1 = (df1.set_index([g,'idx','id','variable'])['value']
          .unstack(fill_value='X')
          .sort_index(level=1)
          .reset_index(level=2)
          .reset_index(drop=True)
          .rename_axis(None, axis=1))
print (df1)
     id test_A test_B test_C test_D
0  idx1    ABC      X    ABC    ABC
1  idx1      X      X    XYZ    JKL
2  idx1      X      X      X    XYZ
3  idx0    SSD    ABC     aa    ABC
4  idx0      X    JKL      X    JKL
5  idx0      X    XYZ      X      X

推荐阅读