将pandas数据框基于另一个数据框分为两个数据框

时间:2019-06-24 11:57:10

标签: python pandas dataframe

我试图在Stackoverflow上搜索该问题的答案,尽管有类似的答案,但我试图调整已接受的答案,但我一直在努力实现自己想要的结果。

我有一个数据框:

df = pd.DataFrame({'Customer':
                     ['A', 'B', 'C', 'D'],
                          'Sales':
                     [100, 200, 300, 400],
                          'Cost':
                     [2.25, 2.50, 2.10, 3.00]})

和另一个:

split = pd.DataFrame({'Customer':
                 ['B', 'D']})

我想从原始数据帧df中创建两个新数据帧,一个包含拆分数据帧中的数据,另一个包含不在拆分中的数据。我需要将df的原始结构保留在两个新创建的数据框中。

我已经研究过isin,merge,drop和loops,但必须有一种优雅的方法来解决简单的问题?

1 个答案:

答案 0 :(得分:2)

Series.isinboolean indexing一起使用进行过滤,~则是反布尔掩码:

mask = df['Customer'].isin(split['Customer'])

df1 = df[mask]
print (df1)
  Customer  Sales  Cost
1        B    200   2.5
3        D    400   3.0

df2 = df[~mask]
print (df2)
  Customer  Sales  Cost
0        A    100  2.25
2        C    300  2.10

另一种解决方案也适用,如果需要将多个列与DataFrame.merge匹配(如果没有参数on被所有列连接),请使用带有indicator参数的外部联接:

df4 = df.merge(split, how='outer', indicator=True)
print (df4)
  Customer  Sales  Cost     _merge
0        A    100  2.25  left_only
1        B    200  2.50       both
2        C    300  2.10  left_only
3        D    400  3.00       both

再次使用不同的蒙版进行过滤:

df11 = df4[df4['_merge'] == 'both']
print (df11)
  Customer  Sales  Cost _merge
1        B    200   2.5   both
3        D    400   3.0   both

df21 = df4[df4['_merge'] == 'left_only']
print (df21)
  Customer  Sales  Cost     _merge
0        A    100  2.25  left_only
2        C    300  2.10  left_only