用平均值填充空值
Filling null values with mean
我有一个包含许多 NaN 值的数据集,我想用每列的平均值填充空值。所以我尝试了以下代码:
def fill_mean():
m = [df.columns.get_loc(c) for c in df.columns if c in missing]
for i in m:
df[df.columns[i]] =df[df.columns[i]].fillna(value=df[df.columns[i]].mean())
return df
但我收到此错误:
TypeError: must be str, not int
我要填充的列都是由相同类型组成的:'float64' 或 'O'。
我怀疑问题源于这个事实,但我该如何解决呢?
编辑: 我创建了一个包含列的字典,其中包含缺少某些数据的列的索引以及每列的类型。
di = dict(zip(missing, m2))
def fill_mean():
m = [df.columns.get_loc(c) for c in df.columns if c in missing]
for i in m:
if di[m] == "dtype('float64')":
df[df.columns[i]] = df[df.columns[i]].fillna(value=df[df.columns[i]].mean())
return df
如果我 运行 fill_mean(),现在我得到一个不同的错误:
if di[m] == "dtype('float64')":
TypeError: unhashable type: 'list'
我认为您想首先将列转换为类型 float
,然后使用 df.fillna
,使用 df.mean()
作为 value
参数:
df[["columns", "to", "change"]] = df[["columns", "to", "change"]].astype('float')
df.fillna(df.mean())
注意:如果 all 您数据框中的列可以转换为 float
,那么您只需执行以下操作:
df = df.astype('float').fillna(df.astype('float').mean())
示例:
df = pd.DataFrame({'col1':np.random.choice([np.nan, '1','2'], 10),
'col2':np.random.choice([np.nan, '1', '2'], 10)})
>>> print(df)
col1 col2
0 2 1
1 2 1
2 nan nan
3 1 2
4 1 2
5 nan 2
6 2 2
7 2 2
8 1 2
9 nan 1
df[['col1', 'col2']] = df[['col1', 'col2']].astype('float')
df = df.fillna(df.mean())
>>> print(df)
col1 col2
0 2.000000 1.000000
1 2.000000 1.000000
2 1.571429 1.666667
3 1.000000 2.000000
4 1.000000 2.000000
5 1.571429 2.000000
6 2.000000 2.000000
7 2.000000 2.000000
8 1.000000 2.000000
9 1.571429 1.000000
我有一个包含许多 NaN 值的数据集,我想用每列的平均值填充空值。所以我尝试了以下代码:
def fill_mean():
m = [df.columns.get_loc(c) for c in df.columns if c in missing]
for i in m:
df[df.columns[i]] =df[df.columns[i]].fillna(value=df[df.columns[i]].mean())
return df
但我收到此错误:
TypeError: must be str, not int
我要填充的列都是由相同类型组成的:'float64' 或 'O'。
我怀疑问题源于这个事实,但我该如何解决呢?
编辑: 我创建了一个包含列的字典,其中包含缺少某些数据的列的索引以及每列的类型。
di = dict(zip(missing, m2))
def fill_mean():
m = [df.columns.get_loc(c) for c in df.columns if c in missing]
for i in m:
if di[m] == "dtype('float64')":
df[df.columns[i]] = df[df.columns[i]].fillna(value=df[df.columns[i]].mean())
return df
如果我 运行 fill_mean(),现在我得到一个不同的错误:
if di[m] == "dtype('float64')":
TypeError: unhashable type: 'list'
我认为您想首先将列转换为类型 float
,然后使用 df.fillna
,使用 df.mean()
作为 value
参数:
df[["columns", "to", "change"]] = df[["columns", "to", "change"]].astype('float')
df.fillna(df.mean())
注意:如果 all 您数据框中的列可以转换为 float
,那么您只需执行以下操作:
df = df.astype('float').fillna(df.astype('float').mean())
示例:
df = pd.DataFrame({'col1':np.random.choice([np.nan, '1','2'], 10),
'col2':np.random.choice([np.nan, '1', '2'], 10)})
>>> print(df)
col1 col2
0 2 1
1 2 1
2 nan nan
3 1 2
4 1 2
5 nan 2
6 2 2
7 2 2
8 1 2
9 nan 1
df[['col1', 'col2']] = df[['col1', 'col2']].astype('float')
df = df.fillna(df.mean())
>>> print(df)
col1 col2
0 2.000000 1.000000
1 2.000000 1.000000
2 1.571429 1.666667
3 1.000000 2.000000
4 1.000000 2.000000
5 1.571429 2.000000
6 2.000000 2.000000
7 2.000000 2.000000
8 1.000000 2.000000
9 1.571429 1.000000