删除多重索引中某级为nan的行 (Pandas)
我有一个带有多重索引的表格
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
.
.
.
.
我想删除用户ID为Nan的那一行。如果我想删除另一行,我可以这样做
data = data.drop(1000000021)
但是
data = data.drop('NaN')
data = data.drop(np.nan)
还有其他尝试都返回了不同类型的错误。有没有办法在不重新索引的情况下删除这一行?
2 个回答
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
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.loc
和 df.iloc
就成了不错的选择。因为 df.iloc
主要是用来通过整数索引来选择的,所以你可能更倾向于用 df.loc[...]
来通过标签和布尔掩码来选择。不过这只是我的习惯,Pandas 其实允许你用这三种方式。