我有一个主要数据框如下 -
df1_data = {'ID': {0:'101',1:'102',2:'103',3:'104',4:'105',5:'106'},
'sym' :{0:'A:00',1:'B:10',2:'C:01',3:'A:09',4:'B:12',5:'C:88'}}
main_df = pd.DataFrame(df1_data)
print main_df
还有三种不同的数据框 -
df2_data = {'Num': {0:'101',1:'111',2:'222',3:'333',4:'444',5:'555'}}
A_df = pd.DataFrame(df2_data)
print A_df
df3_data = {'Num': {0:'102',1:'211',2:'212',3:'213',4:'214',5:'215'}}
B_df = pd.DataFrame(df3_data)
print B_df
df4_data = {'Num': {0:'103',1:'311',2:'312',3:'313',4:'314',5:'315'}}
C_df = pd.DataFrame(df4_data)
print C_df
我想要根据一个要求在A_df,B_df和C_df中没有的ID(main_df列)。
我想动态选择数据帧以进行上述比较。如果sym是A:00(仅从A:00中抓取“A”并与字符串“A”进行比较),则选择A_df检查ID-101和104(如果可用)在A_df的Num列中。
预期结果 - 我希望通过处理上述要求,在A_df,B_df和C_df的Num列中找不到main_df的所有ID。
ID sym
0 104 A:09
1 105 B:12
2 106 C:88
答案 0 :(得分:1)
您可以首先concat
将所有DataFrame与参数keys
一起使用,然后使用indexing with str创建新列a
,使用merge
创建最后boolean indexing
:
df = pd.concat([A_df,B_df,C_df], keys=list('ABC'))
.reset_index(level=1, drop=True)
.rename_axis('a')
.reset_index()
print (df)
a Num
0 A 101
1 A 111
2 A 222
3 A 333
4 A 444
5 A 555
6 B 102
7 B 211
8 B 212
9 B 213
10 B 214
11 B 215
12 C 103
13 C 311
14 C 312
15 C 313
16 C 314
17 C 315
main_df['a'] = main_df.sym.str[0]
main_df = main_df.rename(columns={'ID':'Num'})
print (main_df)
Num sym a
0 101 A:00 A
1 102 B:10 B
2 103 C:01 C
3 104 A:09 A
4 105 B:12 B
5 106 C:88 C
df1 = pd.merge(df, main_df, how='outer', indicator=True)
df1 = df1[df1._merge == 'right_only'].drop(['_merge', 'a'], axis=1).reset_index(drop=True)
print (df1)
Num sym
0 104 A:09
1 105 B:12
2 106 C:88
另一个更快的解决方案是类似的,仅使用index
,最后boolean indexing
使用isin
:
df = pd.concat([A_df,B_df,C_df], keys=list('ABC')).reset_index(level=1, drop=True)
print (df)
Num
A 101
A 111
A 222
A 333
A 444
A 555
B 102
B 211
B 212
B 213
B 214
B 215
C 103
C 311
C 312
C 313
C 314
C 315
main_df.index = main_df.sym.str[0]
print (main_df)
ID sym
sym
A 101 A:00
B 102 B:10
C 103 C:01
A 104 A:09
B 105 B:12
C 106 C:88
print (main_df[~main_df.ID.isin(df.Num)].reset_index(drop=True))
ID sym
0 104 A:09
1 105 B:12
2 106 C:88