python - 保留在 pandas 数据框上的 groupby 操作期间无法聚合的列数据的最佳方法是什么?

标签 python pandas dataframe pandas-groupby

Pandas dataframes 非常适合存储非同类数据类型,groupby 方法为聚合数据增加了很多灵 active ;但是,我经常希望保留在执行 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 - 保留在 pandas 数据框上的 groupby 操作期间无法聚合的列数据的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60555903/

相关文章:

python - 如何将 Pygame 程序编译为 Windows .exe

python - 获取 NumPy 数组(或列表)的 "slices"长度而不实际切片

python - sum 和 groupby 对我使用 pandas 不起作用

python - 当半衰期已知时,如何填充药物不规则时间序列的缺失值

python - 根据分组和条件更新数据框列

python - 绘制 Pandas 数据框的饼图和表格

Python Pandas 在数据框中复制行

python - Seaborn:带有频率的计数图()

python - 优化比较 DataFrame 的 Pandas 函数

python - 在 Pandas Python 中处理多重索引