Pandas不会在标签

时间:2016-04-21 11:41:46

标签: python pandas dataframe

我有两个重叠索引的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   

4 个答案:

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

用于方法:

  • DataFrame.ix(some_index):允许您在索引上对DataFrame进行子集化
  • DataFrame.index.intersection(some_index):返回索引的交集

设置

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