Pandas 分组 python

Pandas Groupby python

我有一个数据集,其中包含国家名称和一些其他信息,例如文件中的薪水。问题是我需要在文件中找到按 country_id 和城市分组的员工的平均工资,范围为 (0, 5000] (5000, 10000] 和 (10000, 15000]。 我正在使用这种方法,但结果 table 并不是我想要的。你能帮我吗?

df = file.groupby(['country_id',"city"])['salary'].mean().reset_index(name="mean") 
bins = [0, 5000]
df['binned'] = pd.cut(df['mean'], bins)
print(df)

我想如果你的工资箱范围总是5000,你可以使用/运算符和math.ceil

创建每行的箱号
import math
df = pd.DataFrame({
    'salary':[
        1231, 5000, 7304, 10000, 12302, 15000,
        1001, 4900, 6012, 9123, 11231, 14923
    ],
    'country': [
        'USA','USA','USA','USA','USA','USA',
        'UK','UK','UK','UK','UK','UK'
    ]
})
df['salary_bin_number'] = (df['salary'] / 5000).apply(lambda x: math.ceil(x))
df.head()

salary country salary_bin_number
1231 USA 1
5000 USA 1
7304 USA 2
10000 USA 2
12302 USA 3

使用salary_bin_number,您可以使用以下代码创建bin的列名

df['salary_range_str'] = df['salary_bin_number'].apply(
    lambda bin_number: f'({(bin_number-1) * 5000}-{(bin_number) * 5000}]'
)

然后按salary_range_strcountry分组计算每个country,salary_range_str的平均工资。

df = df.groupby(['country', 'salary_range_str'])['salary'].mean().reset_index()

最后,将列 salary_range_str 旋转为列。

df = pd.pivot_table(df, index='country', columns='salary_range_str', values='salary')

输出

country (0-5000] (10000-15000] (5000-10000]
UK 2950.5 13077 7567.5
USA 3115.5 13651 8652