python - 使用 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
and 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
推荐阅读
- android - 使用 `flutter install` 在 Android 上更新 Flutter App
- bots - 如何以编程方式向@BotFather 发送消息?
- numpy - 如何在numpy中选择双精度数组的特定行和列来形成子矩阵?
- python - 从 colab 加载模型时没有名为“sklearn.svm._classes”的模块
- javascript - Jest 不加载环境变量(即使使用 --setupFiles dotenv/config)
- python - Juypter 笔记本 - 文本部分未打印
- c - 在数组中找到 MIN 的最大安全函数
- css - 手机中的容器尺寸错误
- c++ - 我需要用 nullptr 初始化吗?
- ruby - 如何在 Ruby 的模块中定义类级宏?