【问题标题】:Replace value with the average of it's column with Pandas用 Pandas 的列的平均值替换值
【发布时间】:2021-11-11 10:48:07
【问题描述】:

我有一个csv 文件,其中包含多个包含数值的列。但是,某些行在一列或多列中缺少值。缺失值用“x”表示。

如何使用 Pandas 将所有缺失值 ('x') 替换为其列中所有值的平均值?

df=  pd.read_csv('file.csv')

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

首先要识别的是其中包含“x”的列不是整数数据类型。它们是对象数据类型。

df = pd.read_csv('file.csv')

df

    Col1    Col2
0   1   22
1   2   44
2   3   x
3   4   88
4   5   110
5   6   132
6   7   x
7   8   176
8   9   198
9   10  x

df.dtypes

Col1     int64
Col2    object
dtype: object

为了得到 Col2 的均值,需要将其转换为数值。

df['Col2'] = pd.to_numeric(df['Col2'], errors='coerce').astype('Int64')

df.dtypes
Col1    int64
Col2    Int64
dtype: object

df 现在看起来像这样:

df 

Col1    Col2
0   1   22
1   2   44
2   3   <NA>
3   4   88
4   5   110
5   6   132
6   7   <NA>
7   8   176
8   9   198
9   10  <NA>

现在我们可以将 fillna() 与 df['Col2'].mean() 一起使用:

df['Col2'] = df['Col2'].fillna(df['Col2'].mean())

df
    Col1    Col2
0   1   22
1   2   44
2   3   110
3   4   88
4   5   110
5   6   132
6   7   110
7   8   176
8   9   198
9   10  110

【讨论】:

  • "首先要识别的是,其中包含 'x' 的列不是整数。它们是对象。"他们的数据类型是object。实际的列本身并不是整数,即使它们只包含整数。
【解决方案2】:
avg = df[column].mean()
df[column] = df[column].apply(lambda v: avg if v=="x" else v)

【讨论】:

    【解决方案3】:

    您将遇到对具有非数字值(例如“x”)的列求平均值的问题。您必须先解决这个问题,例如使用df = df.replace('x',np.nan)(仅当x 是唯一的非数字值时才有效),然后您可以使用df = df.fillna(df.mean())。如果您从整数开始,其中带有x 的列将被转换为浮点数(即使是未被替换的行),因此如果您不希望这样做,您将不得不做更多的工作。

    【讨论】:

      猜你喜欢
      • 2013-09-12
      • 2016-01-08
      • 2020-01-16
      • 2021-01-19
      • 2023-03-08
      • 1970-01-01
      • 2023-02-21
      相关资源
      最近更新 更多