我目前正在学习如何使用Pandas,而我正在尝试使用线性回归生成的最佳拟合线来替换缺失数据(Horsepower功能) Displacement专栏。我正在做的只是迭代数据帧中在Horsepower列中标记为NaN的部分,并通过将同一行中Displacement的值输入到最佳拟合算法来替换数据。我的代码如下所示:
for row, value in auto_data.HORSEPOWER[pd.isnull(auto_data.HORSEPOWER)].iteritems():
auto_data.HORSEPOWER[row] = int(round(slope * auto_data.DISPLACEMENT[row] + intercept))
现在,代码正常工作,数据按预期更换,但在运行时会生成SettingWithCopyWarning
。我理解为什么会产生警告,而且在这种情况下我很好,但是如果有更好的方法来遍历子集,或者一种方法更优雅,我会这样做而是避免链式索引可能导致将来出现真正的问题。
我查看了文档,并通过Stack Overflow上的其他答案。所有解决方案似乎都使用.loc
,但我似乎无法找出使用.loc
获取NaN行子集的正确语法。感谢任何帮助。如果有帮助,数据框如下所示:
auto_data.dtypes
Out[15]:
MPG float64
CYLINDERS int64
DISPLACEMENT float64
HORSEPOWER float64
WEIGHT int64
ACCELERATION float64
MODELYEAR int64
NAME object
dtype: object
答案 0 :(得分:2)
IIUC你应该能够做到:
auto_data.loc[auto_data[HORSEPOWER].isnull(),'HORSEPOWER'] = np.round(slope * auto_data['DISPLACEMENT'] + intercept)
以上将被矢量化并避免循环,你得到的错误是这样做的:
auto_data.HORSEPOWER[row]
我想如果你这样做了:
auto_data.loc[row,'HORSEPOWER']
然后不应该发出警告
答案 1 :(得分:1)
不是逐行循环遍历DataFrame,而是以整齐列的矢量化方式计算外推值会更有效:
y = (slope * auto_data['DISPLACEMENT'] + intercept).round()
然后使用update
替换NaN值:
auto_data['HORSEPOWER'].update(y)
使用update
适用于替换NaN值的特定情况。
Ed Chum's solution显示了如何使用布尔掩码和auto_data.loc
替换任意行中的值。
例如,
import numpy as np
import pandas as pd
auto_data = pd.DataFrame({
'HORSEPOWER':[1, np.nan, 2],
'DISPLACEMENT': [3, 4, 5]})
slope, intercept = 2, 0.5
y = (slope * auto_data['DISPLACEMENT'] + intercept).round()
auto_data['HORSEPOWER'].update(y)
print(auto_data)
产量
DISPLACEMENT HORSEPOWER
0 3 6
1 4 8
2 5 10