首页 > 解决方案 > 连接具有相同索引的行,删除重复项

问题描述

*这不是第一次在这里被问到,但我还没有看到任何与多列相关的 Q

示例数据:

               1        2        3 ........
Orange        |a        |d       |e
Orange        |b        |b       |e
Black         |y        |z       |nan
Black         |x        |y       |nan
Black         |z        |nan     |nan
Black         |w        |x       |y
Blue          |g        |h       |i
Blue          |i        |nan     |nan
..

我正在尝试加入相同的索引行,并删除重复项,即橙色:abde

通过以下方式连接相同的索引行:

df = df.groupby(df.index).agg(lambda z: ','.join(z.astype(str)))

之后,我将所有行都用逗号连接在某些列中。我试图将它们移动到单独的列:

 df = df.columns.str.split(',',expand=True)

但它没有用。

将它们移动到单独的列后,我将使用 drop_duplicates()。

在展开部分需要帮助。

已编辑(无需订购):

               1        2        3       4       5       6       7....
Orange        |a        |b       |d      |e
Black         |y        |z       |x      |w
Blue          |g        |h       |i

标签: pythonpandassplit

解决方案


您可以通过获取unique每组索引的值来做到这一点,一旦您stack在一个列中获取所有值,然后Series为每组创建一个具有唯一元素的值。最后unstack得到预期的输出。

res = (
    df.stack()
      .groupby(level=0)
      .apply(lambda x: pd.Series(x.unique()))
      .unstack()
)
print(res)
        0  1  2    3
Black   y  z  x    w
Blue    g  h  i  NaN
Orange  a  d  e    b

请注意,如果nan是字符串并且您不想要它们,则可以.replace('nan', np.nan)在 groupby 之前添加,它们将在unique.


推荐阅读