使用自动选择聚合数据
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')
我正在尝试总结我的数据。下面你可以看到我的数据示例
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')