使用
groupby
+
agg
,传递自定义的聚合函数
list
:
f = [
('Distinct', 'nunique'),
('Values', lambda x: ', '.join(x.unique()))
]
df.groupby('Name').Color.agg(f).reset_index()
Name Distinct Values
0 Greg 2 Red, Blue
1 John 2 Blue, Yellow
时间
首先,进行设置 -
df = pd.DataFrame(
np.random.randint(0, 1000, (10000, 2)).astype(str), columns=['Name', 'Color']
)
接下来是时间问题。看起来pd.Series.unique
速度过慢(慢了4倍)。为了提高性能,我将使用np.unique
代替:
%%timeit
f = [
('Distinct', 'nunique'),
('Values', lambda x: ', '.join(np.unique(x.values).tolist()))
]
df.groupby('Name').Color.agg(f).reset_index()
122 ms ± 1.51 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
使用lambda x: ', '.join(x.unique())
会导致速度减慢4倍。在这些数据上,使用set
会快一些,但这真的取决于具体情况。
# @jpp
v = df.groupby('Name')['Color'].apply(set).reset_index()
v['Distinct'] = v['Color'].map(len)
v['Color'] = v['Color'].map(', '.join)
219 ms ± 1.83 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%%timeit
(df.groupby('Name')['Color'].agg(['nunique', lambda x: ', '.join(set(x))])
.rename(columns={'nunique':'Distinct', '<lambda>':'Values'})
.reset_index())
118 ms ± 4.29 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
在处理数据时,性能会因数据的不同而差异极大,在决定使用何种解决方案之前,建议对自己的数据进行时间测试。
agg
了吗? - cs95Name
的值,对该值过滤数据帧并应用一个lambda函数。 - shakedzynuinque
而不是map(len)
,但可能是因为我在学习Python之前就已经接触了Pandas。 - jpp