我试图为每个观察结果生成一个唯一的组值,该观察值由连接在一起的列的内容组成,同时保持所有行不变。
我的观察结果可以分组在特定的列中(下面的列A
)。我想为每个组创建一个唯一的值,该值由该组每一行的内容组成,但保持不变。
我尝试提供here和here的解决方案,但是这些解决方案折叠了结果,每组只保留一行,而我希望保留所有行。
import pandas as pd
d = {'A': [1, 2, 3, 3, 4, 5, 5, 6],
'B': [345, 366, 299, 455, 879, 321, 957, 543]}
df = pd.DataFrame(d)
print(df)
A B
0 1 345
1 2 366
2 3 299
3 3 455
4 4 879
5 5 321
6 5 957
7 5 689
8 6 543
df['B'] = df['B'].astype(str)
df['B_concat'] = df.groupby(['A'])['B'].apply('/'.join)
print(df)
A B B_concat
0 1 345 NaN
1 2 366 345
2 3 299 366
3 3 455 299/455
4 4 879 879
5 5 321 321/957/689
6 5 957 543
7 5 689 NaN
8 6 543 NaN
同一组中的单元应具有相同的B_concat
值。
A B B_concat
0 1 345 345
1 2 366 366
2 3 299 299/455
3 3 455 299/455
4 4 879 879
5 5 321 321/957/689
6 5 957 321/957/689
7 5 689 321/957/689
8 6 543 543
答案 0 :(得分:1)
使用GroupBy.transform
返回Series
,其大小与原始DataFrame
相同,因此可以分配给新列:
df['B'] = df['B'].astype(str)
df['B_concat'] = df.groupby(['A'])['B'].transform('/'.join)
一种解决方案应该是:
df['B_concat'] = df['B'].astype(str).groupby(df['A']).transform('/'.join)
print (df)
A B B_concat
0 1 345 345
1 2 366 366
2 3 299 299/455
3 3 455 299/455
4 4 879 879
5 5 321 321/957
6 5 957 321/957
7 6 543 543
或者:
df['B_concat'] = df.groupby(['A'])['B'].transform(lambda x: '/'.join(x.astype(str)))