我遇到了无数线程(1 2 3 ...),但仍然找不到解决问题的方法... 我有一个这样的数据框:
prop1 prop2 prop3 prop4
L30 3 bob 11.2
L30 54 bob 10
L30 11 john 10
L30 10 bob 10
K20 12 travis 10
K20 1 travis 4
K20 66 leo 10
我想对prop1和AND进行分组,同时将所有其他列汇总,但仅包含唯一值。像这样:
prop1 prop2 prop3 prop4
L30 3,54,11,10 bob,john 11.2,10
K20 12,1,66 travis,leo 10,4
我尝试了不同的方法:
df.groupby('prop1')['prop2','prop3','prop4'].apply(np.unique)
返回AttributeError:“ numpy.ndarray”对象没有属性“ index” 加上TypeError:Series.name必须是可哈希的类型
还:.apply(lambda x: pd.unique(x.values.ravel()).tolist())
给出了一个列表作为输出,我想要列。
df.groupby('prop1')['prop2','prop3','prop4'].unique()
本身不起作用,因为有多个列。
.apply(f)
,f为:
def f(df):
df['prop2']=df['prop2'].drop_duplicates()
df['prop3']=df['prop3'].drop_duplicates()
df['prop4']=df['prop4'].drop_duplicates()
return df
什么都不做。
.agg()
用于其他选项,但没有成功。你们中的一个有什么主意吗?
非常感谢:)
答案 0 :(得分:2)
使用groupby
和agg
,并通过调用Series.unique
仅汇总唯一值:
df.astype(str).groupby('prop1').agg(lambda x: ','.join(x.unique()))
prop2 prop3 prop4
prop1
K20 12,1,66 travis,leo 10.0,4.0
L30 3,54,11,10 bob,john 11.2,10.0
df.astype(str).groupby('prop1', sort=False).agg(lambda x: ','.join(x.unique()))
prop2 prop3 prop4
prop1
L30 3,54,11,10 bob,john 11.2,10.0
K20 12,1,66 travis,leo 10.0,4.0
如果处理NaN很重要,请提前致电fillna
:
import re
df.fillna('').astype(str).groupby('prop1').agg(
lambda x: re.sub(',+', ',', ','.join(x.unique()))
)
prop2 prop3 prop4
prop1
K20 12,1,66 travis,leo 10.0,4.0
L30 3,54,11,10 bob,john 11.2,10.0
答案 1 :(得分:1)
melt
+ pivot_table
s = df.astype(str).melt(id_vars='prop1').drop_duplicates()
s.pivot_table(
index='prop1',
columns='variable',
values='value',
aggfunc=','.join)
variable prop2 prop3 prop4
prop1
K20 12,1,66 travis,leo 10.0,4.0
L30 3,54,11,10 bob,john 11.2,10.0
答案 2 :(得分:1)
尝试一下,它非常适合我:
df.groupby(['prop1','prop2', 'prop4']).agg(lambda x: ','.join(x.unique())).reset_index()
结果将为:
prop1 prop2 prop3 prop4
L30 3,54,11,10 bob,john 11.2,10
K20 12,1,66 travis,leo 10,4