为什么dropna()没有像我期望的那样工作?

时间:2016-07-02 17:03:30

标签: python pandas

我已经问了一次这个问题,但删除了它,因为它没有以正确的方式解决问题。

我想删除包含NaN的所有行。我很确定我需要申请

df.dropna(how='all', inplace=True)

实现我的需要。但由于某种未知的原因,它根本不起作用。我甚至怀疑这是一个与软件/版本相关的问题。我正在使用anaconda和pandas 0.18.0以及conda版本的conda版本:4.1.2   conda-build版本:1.19.0        python版本:3.5.1.final.0      请求版本:2.9.1

我使用以下命令从csv创建数据框:

df1 = pd.read_csv('Vols.csv', sep=',', parse_dates=True, 
index_col="Date",usecols=['Date','60DAY_IMPVOL'])
df2 = pd.read_csv('DAX02072016.csv', sep=',', index_col= "Date", parse_dates=True,
usecols=['Date','Close'])
df = pd.concat([df1, df2], axis=1)

我得到的是数据框:

         60DAY_IMPVOL        Close
Date
2004-02-03     NaN            4057.510010
2004-02-04     NaN            4028.370117
2004-02-05     NaN            4014.790039
2004-02-06     18.54          4044.989990
2004-02-09     17.76          4098.970215
2004-02-10     NaN            4077.635363

并且当我使用axis = 1或axis = 0时,应用dropna()不会产生任何结果。所以任何人都有任何建议可能是它不起作用的原因吗?

1 个答案:

答案 0 :(得分:3)

how='all'并不意味着"删除包含NaN"的所有行,这意味着"删除所有行 NaN"。您需要how='any',这意味着"删除包含任何 NaN"的行。

>>> df.dropna(how='all')
            60DAY_IMPVOL        Close
Date                                 
2004-02-03           NaN  4057.510010
2004-02-04           NaN  4028.370117
2004-02-05           NaN  4014.790039
2004-02-06         18.54  4044.989990
2004-02-09         17.76  4098.970215
2004-02-10           NaN  4077.635363
>>> df.dropna(how='any')
            60DAY_IMPVOL        Close
Date                                 
2004-02-06         18.54  4044.989990
2004-02-09         17.76  4098.970215

how='any'实际上是默认值,所以说实话,df.dropna()也会有效。

(请注意,inplace=True有点不受欢迎,通常我们这些日子只会写df = df.dropna(how='any')。)

相关问题