[英]Aggregate unique values from multiple columns with pandas GroupBy
我進入了無數線程( 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 上做一個 groupby,同時,聚合所有其他列,但只有唯一值。 像那樣:
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' PLUS TypeError: Series.name must be a hashable type
另外: .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()
與不同的選項一起使用,但沒有成功。你們中的一個人有什么想法嗎?
非常感謝 :)
使用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
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
試試這個,它對我很有效:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.