【问题标题】:Find mean, mode and median with Python使用 Python 查找均值、众数和中位数
【发布时间】:2021-04-14 11:07:10
【问题描述】:

我正在尝试计算数据框中 2 列的平均值、众数和中位数。我想按 COL1 分组并计算 COL2 的平均值、众数和中位数。有许多列和行,但我希望使用的 2 个示例如下所示

    COL1      COL2    
1   (0-9)      64  
2   (10-19)    74   
3   (20-29)    64
4   (0-9)      62

我一直在尝试以下代码,但不断出错:

data.groupby('COL1')['COL2'].mean()

如果我只使用 COL1 进行分组,这将返回其他 2 列的平均值(和中位数,但不是众数),但不是 COL2:

data1 = data.groupby(['COL1']).mean()

我认为 COL2 显示为对象可能存在问题,但我很难解决这个问题。示例错误如下所示:

pandas.core.base.DataError:没有要聚合的数字类型

【问题讨论】:

  • 什么是 df.dtypes
  • 如果我做一个 dtypes COL2 显示为一个对象,COL1 也是如此。

标签: python python-3.x pandas


【解决方案1】:

您可以将类型设置为int,然后使用pd.Series.mode 计算模式(以及平均值和中位数)

df = df[df.notna()] #Handling nans
df['COL2'] = df['COL2'].astype(float)

mode = pd.Series.mode

#INCASE OF ValueError: Must produce aggregated value, Use this for mode
#mode = lambda x: pd.Series.mean(pd.Series.mode(x))

out = df.groupby("COL1")["COL2"].agg(['mean','median', mode])
print(out)

如果一个组没有单一模式,您可以取pd.Series.mode 返回的模式的平均值。只需将模式替换为注释的 lambda 函数即可。

单个值的平均值不会改变众数。随意将函数更改为您对模式的定义,以防找不到单一模式。

【讨论】:

  • 谢谢,但第一行导致错误,如下所示。这导致我再次查看该数据最初来自的 CSV,我注意到有一些空白数据。我尝试用 null 填充它,当它既为空白又为 null 时,我得到以下信息: ValueError: invalid literal for int() with base 10: 'null'
  • 数据中有空值。在第一行之前添加 df = df.notna()。
  • 我已经尝试过了,但现在我所有的其他列现在都返回一个布尔值,所以 COL1 现在显示:False True 应该是:COL1 (0-9) (10-19) (20- 29)(0-9)
  • 更新了我的答案,请检查。另外请阅读pandas documentation 了解如何调试代码。谢谢!
  • 不用担心。尝试围绕您面临的这些问题写另一个问题。也许更多的人也可以帮助解决它们。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2017-01-11
  • 2021-11-10
  • 1970-01-01
  • 2019-02-02
相关资源
最近更新 更多