Pandas 用 NaN 值填充列中的单元格,从行中的其他单元格中导出值
Pandas fill cells in a column with NaN values, derive the value from other cells in the row
我有一个数据框:
a b c
0 1 2 3
1 1 1 1
2 3 7 NaN
3 2 3 5
...
我想使用机器学习算法就地填充列 "three"(更新值),其中值为 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 方式使用 pandas 来做到这一点。有人可以帮忙吗?或者还有其他方法吗?
您必须执行以下操作:
df.loc[pd.isnull(df['three']), 'three'] = _result of model_
这直接修改数据帧df
通过这种方式,您首先过滤数据帧以保留要修改的切片 (pd.isnull(df['three'])
),然后从该切片中 select 您要修改的列 (three
).
在等式的右侧,它期望得到一个数组/列表/系列,其行数与过滤后的数据框(在您的示例中为一行)相同
您可能需要根据您的模型returns进行调整
编辑
你可能需要像这样做 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 的方式。预测的时候需要把整个数据集传给模型。
最简单的方法是先转置,然后正向 fill/backward 在您方便时填写。
df.T.ffill().bfill().T
我有一个数据框:
a b c
0 1 2 3
1 1 1 1
2 3 7 NaN
3 2 3 5
...
我想使用机器学习算法就地填充列 "three"(更新值),其中值为 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 方式使用 pandas 来做到这一点。有人可以帮忙吗?或者还有其他方法吗?
您必须执行以下操作:
df.loc[pd.isnull(df['three']), 'three'] = _result of model_
这直接修改数据帧df
通过这种方式,您首先过滤数据帧以保留要修改的切片 (pd.isnull(df['three'])
),然后从该切片中 select 您要修改的列 (three
).
在等式的右侧,它期望得到一个数组/列表/系列,其行数与过滤后的数据框(在您的示例中为一行)相同
您可能需要根据您的模型returns进行调整
编辑
你可能需要像这样做 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 的方式。预测的时候需要把整个数据集传给模型。
最简单的方法是先转置,然后正向 fill/backward 在您方便时填写。
df.T.ffill().bfill().T