我有下表和多索引
value
userid date
NaN 2014-06-12 42799
2014-06-13 47673
2014-06-14 47042
2014-06-15 48079
2014-06-16 44873
2014-06-17 46586
2014-06-18 44575
1000000021 2014-06-17 0
1000000024 2014-06-22 20
1000000043 2014-06-12 14
2014-06-14 22
.
.
.
.
我想删除用户标识为Nan的行。如果我想放弃另一行我可以做
data = data.drop(1000000021)
但是
data = data.drop('NaN')
data = data.drop(np.nan)
和其他尝试都会返回不同种类的错误。有没有办法放弃行而不必重新索引?
答案 0 :(得分:0)
您可以使用df.index.labels[0] == -1
标识索引为NaN的行,并使用df.loc
选择其他行:
In [48]: df.loc[~(df.index.labels[0] == -1)]
Out[48]:
value
userid date
1000000021 2014-06-17 0
1000000024 2014-06-22 20
1000000043 2014-06-12 14
2014-06-14 22
使用布尔索引时,df[...]
,df.loc[...]
和df.iloc[...]
的行为都相同。但是,df[...]
通常用于选择列,因此您可能希望避免使用df[...]
来选择行,如上所述。这使得df.loc
和df.iloc
成为可行的选择。由于df.iloc
主要是为了通过整数索引进行选择而创建的,因此您可能希望使用df.loc[...]
通过布尔掩码选择标签和。但这只是我的惯例 - 熊猫允许所有这三个。
答案 1 :(得分:0)
更容易从帧中重置和删除,然后设置索引。
In [3]: df = DataFrame(np.random.randint(0,10,size=16).reshape(-1,1),columns=['value'],index=pd.MultiIndex.from_product([[np.nan,1,2,3],pd.date_range('20130101',periods=4)],names=['first','second']))
In [4]: df
Out[4]:
value
first second
NaN 2013-01-01 0
2013-01-02 2
2013-01-03 9
2013-01-04 3
1 2013-01-01 8
2013-01-02 8
2013-01-03 5
2013-01-04 3
2 2013-01-01 4
2013-01-02 1
2013-01-03 2
2013-01-04 7
3 2013-01-01 3
2013-01-02 9
2013-01-03 3
2013-01-04 4
In [5]: df.reset_index().dropna(subset=['first']).set_index(['first','second'])
Out[5]:
value
first second
1 2013-01-01 8
2013-01-02 8
2013-01-03 5
2013-01-04 3
2 2013-01-01 4
2013-01-02 1
2013-01-03 2
2013-01-04 7
3 2013-01-01 3
2013-01-02 9
2013-01-03 3
2013-01-04 4