使用自动选择聚合数据

Aggregating data with automatic selection

我正在尝试总结我的数据。下面你可以看到我的数据示例

data = {'id':['1','2','3','4','5'],
        'name': ['Company1', 'Company1', 'Company3', 'Company4', 'Company5'], 
        'employee': [10.2, 3.5, 5, 1, 0], 
        'sales': [10, 10, 55, 1, 0], 
        'streets':['1a', '3b', 5, 1, 0], 
       }
df = pd.DataFrame(data, columns = ['id','name', 'employee','sales','streets'])

现在我想总结我数据集中的所有数值。我总结如下:

df = df.groupby(['id','name',]).agg({'employee':sum,
                                    'sales':sum,
                                    }).reset_index()   

但这只是一个小例子,通常,我有一个包含大约 10 个数值的数据集要汇总,所以有人可以帮助我如何以简单的方式汇总所有这些数据吗?

我尝试使用下面的代码

df = df.groupby(['id','name',]).agg({df.select_dtypes(include = ['float64', 'int64'])
                                    }).reset_index()   

但我收到错误 unhashable type: 'DataFrame'

谁能帮我解决这个问题?

GroupBy.sum 应默认聚合所有数字列(并且仅那些),因此

df.groupby(['id', 'name'], as_index=False).sum()

  id      name  employee  sales
0  1  Company1      10.2     10
1  2  Company1       3.5     10
2  3  Company3       5.0     55
3  4  Company4       1.0      1
4  5  Company5       0.0      0

as_index=False 替代后续的 reset_index().

(您当前的错误是因为您试图从 DataFrame 中创建一个集合(使用 {...}),但它的不可散列性使其失败。)

df.select_dtypes returns 基于列数据类型的 df 列的子集,因此您可以 groupby df 的相关列(在此示例中,“id”和“name”列)并将函数应用于此子集:

out = df.select_dtypes(include = ['float64', 'int64']).groupby([df['id'],df['name']]).sum()

输出:

             employee  sales
id name                     
1  Company1      10.2     10
2  Company1       3.5     10
3  Company3       5.0     55
4  Company4       1.0      1
5  Company5       0.0      0

可能有点晚了,但如果你想使用agg,你也可以使用:

numeric_cols = df.columns[df.dtypes.isin([float, int])]
out = df.groupby(['id', 'name'], as_index=False)[numeric_cols] \
        .agg({'employee': sum, 'sales': sum})

输出:

>>> out
  id      name  employee  sales
0  1  Company1      10.2     10
1  2  Company1       3.5     10
2  3  Company3       5.0     55
3  4  Company4       1.0      1
4  5  Company5       0.0      0

>>> numeric_cols
Index(['employee', 'sales'], dtype='object')