用列表中的值替换 DataFrame 的 NaN 值

问题描述 投票:0回答:2

我有一个包含 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

任何帮助表示赞赏。

python pandas dataframe time-series nan
2个回答
2
投票

使用

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,
 ... 
}

1
投票

使用

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())
© www.soinside.com 2019 - 2024. All rights reserved.