四、索引运算

1. 集合的运算法则

经常会有一种利用集合运算来取出符合条件行的需求,例如有两张表 AB ,它们的索引都是员工编号,现在需要筛选出两表索引交集的所有员工信息,此时通过 Index 上的运算操作就很容易实现。

不过在此之前,不妨先复习一下常见的四种集合运算:

2. 一般的索引运算

由于集合的元素是互异的,但是索引中可能有相同的元素,先用 unique 去重后再进行运算。下面构造两张最为简单的示例表进行演示:

In [166]: df_set_1 = pd.DataFrame([[0,1],[1,2],[3,4]],
   .....:                         index = pd.Index(['a','b','a'],name='id1'))
   .....: 
In [167]: df_set_2 = pd.DataFrame([[4,5],[2,6],[7,1]],
   .....:                         index = pd.Index(['b','b','c'],name='id2'))
   .....: 
In [168]: id1, id2 = df_set_1.index.unique(), df_set_2.index.unique()
In [169]: id1.intersection(id2)
Out[169]: Index(['b'], dtype='object')
In [170]: id1.union(id2)
Out[170]: Index(['a', 'b', 'c'], dtype='object')
In [171]: id1.difference(id2)
Out[171]: Index(['a'], dtype='object')
In [172]: id1.symmetric_difference(id2)
Out[172]: Index(['a', 'c'], dtype='object')

若两张表需要做集合运算的列并没有被设置索引,一种办法是先转成索引,运算后再恢复,另一种方法是利用 isin 函数,例如在重置索引的第一张表中选出id列交集的所在行:

In [173]: df_set_in_col_1 = df_set_1.reset_index()
In [174]: df_set_in_col_2 = df_set_2.reset_index()
In [175]: df_set_in_col_1
Out[175]: 
  id1  0  1
0   a  0  1
1   b  1  2
2   a  3  4
In [176]: df_set_in_col_2
Out[176]: 
  id2  0  1
0   b  4  5
1   b  2  6
2   c  7  1
In [177]: df_set_in_col_1[df_set_in_col_1.id1.isin(df_set_in_col_2.id2)]
Out[177]: 
  id1  0  1
1   b  1  2