用 numpy 数组值填充 Pandas 列 NaN

feg*_*ero 2 regression dataframe pandas sklearn-pandas fillna

很抱歉,如果这个问题对于新手来说似乎太难了,但我一直在寻找答案,但没有找到。

因此,我有一个包含大量 NaN 值的数据集,并且我一直在进行一些回归来预测这些空值,并且由于预测是作为 numpy.ndarray 给出的,所以我尝试用这些值填充列的间隙数组没有成功。

我的意思是,该专栏是这样的:

           ['Records']
      101       21
      102       22
      103       23 
      104       24
      106       NaN
      107       NaN
      108       NaN
      109       NaN
      110       NaN
      111       29
      112       30
Run Code Online (Sandbox Code Playgroud)

该数组是:

   y_pred = [25, 26, 27, 28]
Run Code Online (Sandbox Code Playgroud)

因此, fillna 不处理 numpy 数组来完成这项工作,我尝试将数组设置为 dict、pandas 列等,但没有任何效果。

另外,另一个问题是数组的长度总是与原始列不同。

我很欣赏你的见解。

jez*_*ael 6

首先,如果想用数组的所有值替换所有缺失值,则必须有相同数量的缺失值,例如数组的长度:

#added value
y_pred = [25, 26, 27, 28, 30]
m = df['Records'].isna()

df.loc[m, 'Records'] = y_pred
print (df)
     Records
101     21.0
102     22.0
103     23.0
104     24.0
106     25.0
107     26.0
108     27.0
109     28.0
110     30.0
111     29.0
112     30.0
Run Code Online (Sandbox Code Playgroud)

如果可能长度不匹配,则创建Series带有按长度过滤器的助手并传递给Series.fillna

这里数组的长度 < NaN 的数量:

y_pred = [25, 26, 27, 28]

m = df['Records'].isna()

LenNaN = m.sum()
LenArr = len(y_pred)

s = pd.Series(y_pred[:LenNaN], index=df.index[m][:LenArr])
print (s)
106    25
107    26
108    27
109    28
dtype: int64

df['Records'] = df['Records'].fillna(s)
print (df)
     Records
101     21.0
102     22.0
103     23.0
104     24.0
106     25.0
107     26.0
108     27.0
109     28.0
110      NaN
111     29.0
112     30.0
Run Code Online (Sandbox Code Playgroud)

这里数组的长度 > NaN 的数量:

y_pred = [25, 26, 27, 28, 100, 200, 300]

m = df['Records'].isna()

LenNaN = m.sum()
LenArr = len(y_pred)

s = pd.Series(y_pred[:LenNaN], index=df.index[m][:LenArr])
print (s)
106     25
107     26
108     27
109     28
110    100
dtype: int64

df['Records'] = df['Records'].fillna(s)
print (df)
     Records
101     21.0
102     22.0
103     23.0
104     24.0
106     25.0
107     26.0
108     27.0
109     28.0
110    100.0
111     29.0
112     30.0
Run Code Online (Sandbox Code Playgroud)