【发布时间】:2021-11-11 10:48:07
【问题描述】:
我有一个csv 文件,其中包含多个包含数值的列。但是,某些行在一列或多列中缺少值。缺失值用“x”表示。
如何使用 Pandas 将所有缺失值 ('x') 替换为其列中所有值的平均值?
df= pd.read_csv('file.csv')
【问题讨论】:
我有一个csv 文件,其中包含多个包含数值的列。但是,某些行在一列或多列中缺少值。缺失值用“x”表示。
如何使用 Pandas 将所有缺失值 ('x') 替换为其列中所有值的平均值?
df= pd.read_csv('file.csv')
【问题讨论】:
首先要识别的是其中包含“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
【讨论】:
object。实际的列本身并不是整数,即使它们只包含整数。
avg = df[column].mean()
df[column] = df[column].apply(lambda v: avg if v=="x" else v)
【讨论】:
您将遇到对具有非数字值(例如“x”)的列求平均值的问题。您必须先解决这个问题,例如使用df = df.replace('x',np.nan)(仅当x 是唯一的非数字值时才有效),然后您可以使用df = df.fillna(df.mean())。如果您从整数开始,其中带有x 的列将被转换为浮点数(即使是未被替换的行),因此如果您不希望这样做,您将不得不做更多的工作。
【讨论】: