我有一个包含 14 个变量的 DataFrame,其中有几个 NaN。我想用列表中存在的特定值填充这些 NaNs。
这是 df:
Date CalamarQ InkorQ ... SHelena2P GamboteP DiqueP
243 1990-09-01 6033.0 NaN ... 0.00000 0.000000 0.000000
244 1990-09-02 6167.0 NaN ... 0.00000 0.000000 0.000000
245 1990-09-03 6338.0 NaN ... 11.04219 24.769873 8.574909
246 1990-09-04 6372.0 NaN ... 10.57562 0.000000 0.000000
247 1990-09-05 6412.0 NaN ... 0.00000 0.000000 0.000000
[5 rows x 14 columns]
填充 NaN 的平均值:
[Timestamp('2006-10-31 14:54:32.727272704'), 8644.611548793053, 728.1650092081031, 526.5549786455156, 465.1721615134183, 610.2233078727016, 23.790737704918033, 4.019485580670304, 3.868294812414307, 4.023018770419772, 5.2216239281718835, 5.221623927818927, 5.118163585974665, 3.7718975661621954]
我希望 NaN 填充与列位置对应的平均值,即第二列('CalamarQ')中的 NaN 将替换为 8644.611548793053.
到目前为止,我尝试了以下代码,但无济于事:
i = 1
for i in range(len(averages_wet)):
for col in ts_wet.columns:
ts_wet[cols].fillna(value = averages_wet[i], inplace=True)
和:
ts_wet.CalamarQ.fillna(averages_wet[1], inplace=True)
我得到以下输出:
<ipython-input-9-b7d4c7c0bde3>:4: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
任何帮助表示赞赏。
fillna
和由列名称和值组成的字典(使用 dict
和 zip
):
out = ts_wet.fillna(dict(zip(ts_wet.columns, averages_wet)))
或者,使用
Series
(可能效率较低):
out = ts_wet.fillna(pd.Series(averages_wet, index=ts_wet.columns))
输出:
Date CalamarQ InkorQ ... SHelena2P GamboteP DiqueP
243 1990-09-01 6033.0 728.165009 ... 0.00000 0.000000 0.000000
244 1990-09-02 6167.0 728.165009 ... 0.00000 0.000000 0.000000
245 1990-09-03 6338.0 728.165009 ... 11.04219 24.769873 8.574909
246 1990-09-04 6372.0 728.165009 ... 10.57562 0.000000 0.000000
247 1990-09-05 6412.0 728.165009 ... 0.00000 0.000000 0.000000
中级词典:
{'Date': Timestamp('2006-10-31 14:54:32.727272704'),
'CalamarQ': 8644.611548793053,
'InkorQ': 728.1650092081031,
...
}
DataFrame.fillna
由zip
创建的带有列名的字典:
out = ts_wet.fillna(dict(zip(ts_wet.columns, averages_wet)))
如果想用他们的方式替换所有数字列:
out = ts_wet.fillna(ts_wet.select_dtype(np.number).mean())
#alternative
#out = ts_wet.fillna(ts_wet.select.mean())