如何动态选择数据框进行列比较?

时间:2017-02-08 05:54:13

标签: python pandas

我有一个主要数据框如下 -

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

1 个答案:

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