有没有办法根据索引折叠几列,同时保留其他列?
Posted
技术标签:
【中文标题】有没有办法根据索引折叠几列,同时保留其他列?【英文标题】:Is there a way to collapse a few columns based on an index, while retaining the other columns? 【发布时间】:2021-10-11 19:07:11 【问题描述】:我有一个看起来像这样的数据框:
ID | Var1 | Var2 | Var3 |
---|---|---|---|
1 | row1 | abc | 321 |
1 | row2 | bcd | 456 |
2 | row4 | def | 555 |
2 | row5 | tss | 889 |
我想要做的是根据 ID 在 Var1 中用逗号连接所有字符串,但保留所有其他列。所以最后一个应该是这样的:
ID | Var1 | Var2 | Var3 |
---|---|---|---|
1 | row1, row2 | abc | 321 |
1 | row1, row2 | bcd | 456 |
2 | row4, row5 | def | 555 |
2 | row4, row5 | tss | 889 |
我尝试过聚合,但如果我这样做,Var2 和 Var3 会被丢弃。我有几列我想像使用 Var 1 一样加入它们的行,有没有办法做到这一点?
感谢您的帮助!
【问题讨论】:
您的问题解决了吗? 【参考方案1】:使用groupby()
+transform()
:
如果顺序很重要:
df['Var1']=df.groupby('ID')['Var1'].transform(lambda x:','.join(pd.unique(x)))
如果顺序无关紧要:
df['Var1']=df.groupby('ID')['Var1'].transform(lambda x:','.join(set(x)))
df
的输出:
ID Var1 Var2 Var3
0 1 row1,row2 abc 321
1 1 row1,row2 bcd 456
2 2 row4,row5 def 555
3 2 row4,row5 tss 889
【讨论】:
您好,抱歉,您如何确保仅加入唯一值?所以如果 row1 出现不止一次,那么它不会变成 "row1, row2, row1" 而是 "row1, row2" @JayneHow 更新了答案...请看一下 :)以上是关于有没有办法根据索引折叠几列,同时保留其他列?的主要内容,如果未能解决你的问题,请参考以下文章