Pandas 熊猫用NaN值填充列中的单元格,然后从行中的其他单元格中导出值

Pandas 熊猫用NaN值填充列中的单元格,然后从行中的其他单元格中导出值,pandas,dataframe,scikit-learn,python-3.5,sklearn-pandas,Pandas,Dataframe,Scikit Learn,Python 3.5,Sklearn Pandas,我有一个数据帧: 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=p

我有一个数据帧:

     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循环,但我不想这样做。我认为应该有更多的蟒蛇式的方式来使用熊猫。有人能帮忙吗?或者还有其他方法吗?

您必须执行以下操作:

df.loc[pd.isnull(df['three']),'three']=\u模型的结果

这将直接修改数据帧
df

通过这种方式,首先过滤数据帧以保留要修改的片段(
pd.isnull(df['three'])
),然后从该片段中选择要修改的列(
three

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

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

编辑

你可能需要像这样做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的方式。预测时需要将整个数据集传递给模型。

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

model.predict返回一个整数。问题是predict会获取行中其他单元格中的值,我不知道如何给出这些值。我尝试了你的建议,但没有成功:
df.loc[~df.three.notnull()和++I>0,'three']=model.predict(df.iloc[[I]][[one','two']]].values.tolist()[1])
你能帮帮忙并给出解决方案吗?
没有成功。此外,您是否可以编辑问题以添加有关
模型的更多信息。预测
?需要可复制的代码来帮助进行更深入的讨论。谢谢您的回答。不过,在分配
c
之后,您可能需要删除
pred
列。