我有两个重叠索引的Pandas DataFrames(A和B)。我想删除DataFrame B中的行,而DataFrame A中的索引值并不存在。
我已经查看了DataFrames的Pandas drop方法,但它删除了带有给定标签的列,我想删除没有给出标签的列。
现在我设法做到了:
B.drop(B.drop(A.index).index)
但这显然不是最好的方法(不高效或可读)。还有更好的方法吗?
示例:
DataFrame A :
index col1
1 some_data
2 some_data
3 some_data
4 some_data
DataFrame B :
index col2
1 other_data
2 other_data
3 other_data
4 other_data
5 other_data
6 other_data
我想获取DataFrame B' :
index col2
1 other_data
2 other_data
3 other_data
4 other_data
答案 0 :(得分:4)
我认为您可以isin
使用boolean indexing
:
print B.index.isin(A.index)
[ True True True True False False]
print B[B.index.isin(A.index)]
col2
index
1 other_data
2 other_data
3 other_data
4 other_data
答案 1 :(得分:3)
您可以使用difference
查找不在其他df索引中的行标签:
In [6]:
df2.drop(df2.index.difference(df1.index))
Out[6]:
col2
index
1 other_data
2 other_data
3 other_data
4 other_data
答案 2 :(得分:3)
A = pd.DataFrame( data=np.random.rand( 4 ) , index=range( 4 ) )
# 0
# 0 0.776067
# 1 0.782038
# 2 0.588616
# 3 0.306854
B = pd.DataFrame( data=np.random.rand( 6 ) , index=range( 1 , 7 ) )
# 0
# 1 0.732170
# 2 0.925673
# 3 0.438083
# 4 0.735083
# 5 0.125201
# 6 0.610408
B.loc[ A.index ]
# 0
# 0 NaN
# 1 0.732170
# 2 0.925673
# 3 0.438083
A.index
会为您提供所需内容的索引,然后.loc
可让您选择所需的数据。我上面有一个NaN。我的版本是0.13.1,所以我可能与最近的0.18
答案 3 :(得分:2)
用于方法:
In [1]: A = pd.DataFrame([['some_data']] * 4, index=range(1, 5), columns=['col1'])
In [2]: A
Out[2]:
col1
1 some_data
2 some_data
3 some_data
4 some_data
In [3]: B = pd.DataFrame([['some_data']] * 6, index=range(1, 7), columns=['col2'])
In [4]: B
Out[4]:
col2
1 some_data
2 some_data
3 some_data
4 some_data
5 some_data
6 some_data
In [5]: B.ix[A.index.intersection(B.index)]
Out[5]:
col2
1 some_data
2 some_data
3 some_data
4 some_data