python - 在对熊猫数据框进行分组操作期间,为无法聚合的列保留数据的最佳方法是什么?
问题描述
Pandas 数据帧非常适合存储非同质数据类型,groupby 方法为聚合数据增加了很大的灵活性;但是,我经常希望保留在执行 groupby 操作后无法聚合的基础数据。
示例:
让我们使用以下数据框:
df_cars = pd.DataFrame({
'brand': ['Porsche', 'Porsche', 'Porsche', 'BMW' ,'BMW' ,'BMW'],
'model': ['911 GT3', '911', '911', 'M3', 'M3', 'M3', ],
'speed(mph)': [100, 120, 110, 70, 80, 90]})
如果我要运行以下代码:
df_cars.groupby('brand').mean()
我会得到每个品牌的平均速度(mph);但是,我会丢失模型和品牌列中的基础数据。
为了保留该信息并执行相同的平均计算,我需要运行以下代码:
df_cars.groupby('brand').agg({
'speed(mph)':'mean',
'model': lambda x: x.iloc[0] if x.nunique() == 1 else list(x),
'brand': lambda x: x.iloc[0] if x.nunique() == 1 else list(x)
})
这将返回一个数据帧,其平均值是按品牌计算的,并将基础数据(现已折叠)也保留在结果数据帧中。
这是保留这些信息的最有效方式吗?此外,为什么这不是 groupby 的默认实现中的一个选项,以便更轻松地保留无法聚合的数据?
解决方案
首先,当您汇总数据时,在定义上您将丢失信息,因为您正在汇总数据集。
也就是说,我看到你在这里有两个选择:
1.简化您的代码并应用正确的方法:
df_cars.groupby('brand', as_index=False).agg({
'speed(mph)': 'mean',
'model': 'unique'
})
brand speed(mph) model
0 BMW 80 [M3]
1 Porsche 110 [911 GT3, 911]
或者,如果您不希望列表中的对象类型列:
df_cars.groupby('brand', as_index=False).agg({
'speed(mph)': 'mean',
'model': lambda x: ','.join(np.unique(x))
})
brand speed(mph) model
0 BMW 80 M3
1 Porsche 110 911,911 GT3
2. 按列类型拆分数据并应用简单聚合:
这适用于具有多个对象和数字列的较大数据框
df_cars = df_cars.set_index('brand')
text = df_cars.select_dtypes('object')
numeric = df_cars.select_dtypes(exclude='object')
g1 = text.groupby('brand')
g2 = numeric.groupby('brand')
dfn = g1.agg(np.unique).join(g2.mean()).reset_index()
brand model speed(mph)
0 BMW M3 80
1 Porsche [911, 911 GT3] 110
推荐阅读
- python - 创建 AWS S3 存储桶时,区域 None 是什么意思?
- reactjs - 如何在 Enter 按键上切换 React-Bootstrap 手风琴?
- javascript - 仅使用 CSS 将容器 div 的大小自动调整为其中的 img 元素的尺寸?
- html - 替代标签?这个图像是装饰性的还是应该有一个 Alt 标签?
- typescript - 如何使用 useState 更新组件?
- mysql - 只有当年份与 MySQL 相同时,如何对月份进行分组?
- python - kivy ToggleButton :如何触发状态更改的方法?
- javascript - 如何从团队作者那里删除查看频道的权限?不和谐.js
- c# - WPF FlowDocumentScrollViewer 自动滚动到文档底部
- google-contacts-api - 有什么方法可以绕过 People API 中的 Etag 检查?