按对象数据类型列分组计算Pandas DataFrame的标准差

3 投票
2 回答
39 浏览
提问于 2025-04-14 15:35

我有一个 pandas 数据框,里面有数字类型和对象类型的列。

输入的代码如下:

import pandas as pd

data = {
    'country_code': ['AFG', 'AGO', 'ALB', 'ARE', 'ARG'],
    'country_name': ['Afghanistan', 'Angola', 'Albania', 'United Arab Emirates', 'Argentina'],
    'continent': ['Asia', 'Africa', 'Europe', 'Asia', 'South America'],
    2010: [11.35, 9.43, 14.09, 2.48, 7.71],
    2011: [11.05, 7.36, 13.48, 2.30, 7.18],
    2012: [11.34, 7.35, 13.38, 2.18, 7.22],
    2013: [11.19, 7.37, 15.87, 2.04, 7.10],
    2014: [11.14, 7.37, 18.05, 1.91, 7.27]
}

df = pd.DataFrame(data)

我想计算这个数据框中按对象数据列(比如洲)分组的标准差。

所以,如果我有对象类型的列,我应该能得到数字类型的列,但问题是,当我想获取数字列时,就看不到对象类型的列(洲)了。

df.select_dtypes('number').groupby('continent').std()

有没有其他方法可以做到这一点呢?

2 个回答

0

你可以把一个序列当作分组的依据,这样的话,数据框中不需要事先有这个列:

df.select_dtypes('number').groupby(df['continent']).std()

另外,你可以使用 numeric_only=True 这个参数来自动过滤掉非数字的列,具体是在 groupby.std 方法中使用:

df.groupby('continent').std(numeric_only=True)

输出结果:

                   2010      2011      2012      2013      2014
continent                                                      
Africa              NaN       NaN       NaN       NaN       NaN
Asia           6.272037  6.187184  6.477098  6.470027  6.526596
Europe              NaN       NaN       NaN       NaN       NaN
South America       NaN       NaN       NaN       NaN       NaN
1

假设你有这个 df

  country_code country_name continent  2010  2011
0            A            A    Europe     1    40
1            B            B    Europe     2     5
2            C            C   America     3    60
3            D            D   America     4     7

那么你可以这样做:

out = df.groupby("continent").apply(
    lambda x: x.select_dtypes("number").std(), include_groups=False
)
print(out)

输出结果是:

               2010       2011
continent                     
America    0.707107  37.476659
Europe     0.707107  24.748737

撰写回答