用于清除Pandas

时间:2015-09-02 18:22:28

标签: python pandas

我目前正在学习如何使用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

2 个答案:

答案 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