如何在数据帧上执行以下操作
基于下面的堆栈溢出问题和答案,我编写了下面的代码。最后一次尝试已接近尾声,但我不知道如何将集合转换回字符串(即删除大括号)并将其滚动到lambda函数中,我可以对多个列使用applymap()
示例数据帧
id = [1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]
colA = ['type12', 'type11', 'type11', 'type11', 'type21', 'type21',
'type22', 'type23', 'type23', 'type23', 'type31', 'type31',
'type31', 'type31', 'type41', 'type41', 'type42', 'type41',
'type41', 'type43'
]
colB = ['Set A', 'Set B', 'Set B', 'Set B', 'Set B', 'Set B', 'Set A',
'Set B', 'Set C', 'Set C', 'Set B', 'Set C', 'Set B', 'Set C',
'Set B', 'Set B', 'Set A', 'Set C', 'Set B', 'Set A'
]
colC = ['alpha', 'beta', 'delta', 'charlie', 'beta', 'delta', 'alpha',
'charlie', 'charlie', 'delta', 'delta', 'charlie', 'beta',
'delta', 'beta', 'charlie', 'alpha', 'charlie', 'delta', 'alpha'
]
df = pd.DataFrame(list(zip(id, colA, colB, colC)), columns =['id', 'colA', 'colB', 'colC'])
print(df)
id colA colB colC
0 1 type12 Set A alpha
1 1 type11 Set B beta
2 1 type11 Set B delta
3 1 type11 Set B charlie
4 2 type21 Set B beta
5 2 type21 Set B delta
6 2 type22 Set A alpha
7 2 type23 Set B charlie
8 2 type23 Set C charlie
9 2 type23 Set C delta
10 3 type31 Set B delta
11 3 type31 Set C charlie
12 3 type31 Set B beta
13 3 type31 Set C delta
14 4 type41 Set B beta
15 4 type41 Set B charlie
16 4 type42 Set A alpha
17 4 type41 Set C charlie
18 4 type41 Set B delta
19 4 type43 Set A alpha
所需输出
id colA colB colC
1 type11 Set B beta, delta, charlie
1 type12 Set A alpha
2 type21 Set B beta, delta
2 type22 Set A alpha
2 type23 Set B, Set C charlie, delta
3 type31 Set B, Set C beta, delta, charlie
4 type41 Set B, Set C beta, delta, charlie
4 type42 Set A alpha
4 type43 Set A alpha
仅尝试返回字符串但仍有重复项的一列
df2 = df.groupby(['id', 'colA'])['colB'].apply(', '.join).reset_index()
print(df2)
id colA colB
0 1 type11 Set B, Set B, Set B
1 1 type12 Set A
2 2 type21 Set B, Set B
3 2 type22 Set A
4 2 type23 Set B, Set C, Set C
5 3 type31 Set B, Set C, Set B, Set C
6 4 type41 Set B, Set B, Set C, Set B
7 4 type42 Set A
8 4 type43 Set A
仅尝试删除重复项但返回集合的一列
df2 = df.groupby(['id', 'colA'])['colB'].apply(list).apply(set).reset_index()
print(df2)
id colA colB
0 1 type11 {Set B}
1 1 type12 {Set A}
2 2 type21 {Set B}
3 2 type22 {Set A}
4 2 type23 {Set B, Set C}
5 3 type31 {Set B, Set C}
6 4 type41 {Set B, Set C}
7 4 type42 {Set A}
8 4 type43 {Set A}
您可以在groupby中使用
lambda
drop_duplicates
在组内的序列上,然后加入字符串agg
将处理不是分组列的所有列,或者指定一个子集您很接近,只需进一步应用
list()
和join()
,如下所示:如果要使用lambda函数,请将其与
agg()
一起使用,如下所示:相关问题 更多 >
编程相关推荐