我试图在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,但必须有一种优雅的方法来解决简单的问题?
答案 0 :(得分:2)
将Series.isin
与boolean 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