我有如下所示的DF:
df =
vid pos value sente
1 a A 21
2 b B 21
3 b A 21
3 a A 21
1 d B 22
1 a C 22
1 a D 22
2 b A 22
3 a A 22现在,我希望将具有相同值的所有行( sente和vid )组合成一行,其中包含由" "连接的value值。
df2 =
vid pos value sente
1 a A 21
2 b B 21
3 b a A A 21
1 d a a B C D 22
2 b A 22
3 a A 22我认为对此进行修改就能达到目的:
df2 = df.groupby["sente"].agg(lambda x: " ".join(x))但我似乎不知道如何将第二列添加到语句中。
发布于 2018-05-15 19:29:35
石斑鱼可以作为名单传递。此外,您可以通过去掉lambda代码来稍微简化您的解决方案--这是不需要的。
df.groupby(['vid', 'sente'], as_index=False, sort=False).agg(' '.join)
vid sente pos value
0 1 21 a A
1 2 21 b B
2 3 21 b a A A
3 1 22 d a a B C D
4 2 22 b A
5 3 22 a A其他一些注意事项:指定as_index=False意味着您的石斑鱼将作为结果中的列出现(而不是默认的索引)。此外,sort=False将保留列的原始顺序。
发布于 2018-05-15 19:50:03
对于这个编辑,@cᴏʟᴅ的ᴘᴇᴇᴅ的答案要好得多。
有趣的方式!因为单个char值才有效
df.set_index(['sente', 'vid']).sum(level=[0, 1]).applymap(' '.join).reset_index()
sente vid pos value
0 21 1 a A
1 21 2 b B
2 21 3 b a A A
3 22 1 d a a B C D
4 22 2 b A
5 22 3 a A有点好的答案
df.set_index(['sente', 'vid']).groupby(level=[0, 1]).apply(
lambda d: pd.Series(d.to_dict('l')).str.join(' ')
).reset_index()
sente vid pos value
0 21 1 a A
1 21 2 b B
2 21 3 b a A A
3 22 1 d a a B C D
4 22 2 b A
5 22 3 a A不建议
df.set_index(['sente', 'vid']).add(' ') \
.sum(level=[0, 1]).applymap(str.strip).reset_index()
sente vid pos value
0 21 1 a A
1 21 2 b B
2 21 3 b a A A
3 22 1 d a a B C D
4 22 2 b A
5 22 3 a Ahttps://stackoverflow.com/questions/50357837
复制相似问题