我目前正在学习如何使用Pandas,并且我正处于尝试使用由线性回归与位移列生成的最佳拟合线替换缺失数据(马力特征)的情况。我所做的是只遍历数据框中马力列中标记为NaN的部分,并通过将同一行中的位移值输入到最佳拟合算法中来替换数据。我的代码是这样的:
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
你应该可以这样做:
auto_data.loc[auto_data[HORSEPOWER].isnull(),'HORSEPOWER'] = np.round(slope * auto_data['DISPLACEMENT'] + intercept)
以上将被矢量化并避免循环,你得到的错误是这样做的:
auto_data.HORSEPOWER[row]
我想如果你做了:
auto_data.loc[row,'HORSEPOWER']
则不应引发警告
与其逐行循环遍历DataFrame,不如以矢量化的方式计算整个列的外推值:
y = (slope * auto_data['DISPLACEMENT'] + intercept).round()
,然后使用update
替换NaN值:
auto_data['HORSEPOWER'].update(y)
使用update
适用于替换NaN值的特殊情况。Ed Chum的解决方案展示了如何使用布尔掩码和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