Pandas 用 NaN 值填充列中的单元格,从行中的其他单元格中获取值

Posted

技术标签:

【中文标题】Pandas 用 NaN 值填充列中的单元格,从行中的其他单元格中获取值【英文标题】:Pandas fill cells in a column with NaN values, derive the value from other cells in the row 【发布时间】:2016-10-31 12:38:32 【问题描述】:

我有一个数据框:

     a    b      c
0    1    2      3 
1    1    1      1
2    3    7      NaN
3    2    3      5
...

我想使用机器学习算法在值为 NaN 的地方填充“三”列(更新值)。

我不知道如何就地进行。示例代码:

import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
df=pd.DataFrame([range(3), [1, 5, np.NaN], [2, 2, np.NaN], [4,5,9], [2,5,7]],columns=['a','b','c'])
x=[]
y=[]
for row in df.iterrows():
    index,data = row
    if(not pd.isnull(data['c'])):
        x.append(data[['a','b']].tolist())
        y.append(data['c'])

model = LinearRegression()
model.fit(x,y)

#this line does not do it in place.
df[~df.c.notnull()].assign(c = lambda x:model.predict(x[['a','b']]))

但这给了我数据框的副本。我剩下的唯一选择是使用 for 循环,但是我不想这样做。我认为应该有更多使用熊猫的pythonic方式。有人可以帮忙吗?或者有没有其他方法可以做到这一点?

【问题讨论】:

【参考方案1】:

您必须执行以下操作:

df.loc[pd.isnull(df['three']), 'three'] = _result of model_

这会直接修改数据框df

这样,您首先过滤数据框以保留要修改的切片 (pd.isnull(df['three'])),然后从该切片中选择要修改的列 (three)。

在等号的右侧,它期望得到一个数组/列表/系列,其行数与过滤后的数据帧相同(在您的示例中为一行)

您可能需要根据您的模型准确返回的内容进行调整

编辑

你可能需要像这样做stg

pred = model.predict(df[['a', 'b']])
df['pred'] = model.predict(df[['a', 'b']])
df.loc[pd.isnull(df['c']), 'c'] = df.loc[pd.isnull(df['c']), 'pred']

请注意,问题的很大一部分来自您在示例中使用 scikit learn 的方式。预测时需要将整个数据集传递给模型。

【讨论】:

model.predict 返回一个整数。问题是 predict 获取行的其他单元格中的值,我无法弄清楚如何给出。我尝试了您的建议,但没有成功:df.loc[~df.three.notnull() and ++i > 0,'three'] = model.predict(df.iloc[[i]][['one','two']].values.tolist()[1])您能帮忙并给出解决方案吗? didnt work 不是很精确。另外,您可以编辑问题以添加有关model.predict 的更多信息吗?需要可重现的代码来提供更深入的帮助。 感谢您的回答。不过,您可能希望在分配 c 后删除 pred 列。【参考方案2】:

最简单的方法是先转置,然后在方便时向前填充/向后填充。 df.T.ffill().bfill().T

【讨论】:

以上是关于Pandas 用 NaN 值填充列中的单元格,从行中的其他单元格中获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何在pandas中将多个相同类别的行组合成一个?

如何根据 pandas 数据框中的数据类型填充 NaN 值?

用列表中的值填充 NaN

Pandas - 使用多个值填充 NaN

如何用特定值填充列中的一系列单元格?

当必须使用同一列中的不同值填充单元格时,如何填写该列中的空白单元格?