如何使用复杂条件比较两个数据框中的两个列



假设我有一个数据帧:

import numpy as np
a = [['A',np.nan,2,'x|x|x|y'],['B','a|b',56,'b|c'],['C','c|e|e',65,'f|g'],['D','h',98,'j'],['E','g',98,'k|h'],['F','a|a|a|a|a|b',98,np.nan],['G','w',98,'p'],['H','s',98,'t|u']]
df1 = pd.DataFrame(a, columns=['1', '2','3','4'])
df1
1   2   3   4
0   A   NaN 2   x|x|x|y
1   B   a|b 56  b|c
2   C   c|e|e   65  f|g
3   D   h   98  j
4   E   g   98  k|h
5   F   a|a|a|a|a|b 98  NaN
6   G   w   98  p
7   H   s   98  t|u

和另一个数据帧:

a = [['x'],['b'],['h'],['v']]
df2 = pd.DataFrame(a, columns=['1'])
df2
1
0   x
1   b
2   h
3   v

我想比较df2中的列1与df1中的列2和列4(将其分割为"|"),如果该值与列2或列4中的一个或两个匹配(分割后),我想只提取另一个数据框中df1的那些行,该数据框中添加的列将具有与df1的列2或列4匹配的df2值。例如,结果看起来像这样:

1   2   3   4   5
0   A   NaN 2   x|x|x|y x
1   B   a|b 56  b|c b
2   F   a|a|a|a|a|b 98  NaN b
3   D   h   98  j   h
4   E   g   98  k|h h

解决方案为:DataFrame.agg中两列与Series的连接值,再由Series.str.split拆分,DataFrame.where中的值用DataFrame.isin过滤,再将值连接在一起,不含NaNs,最后过滤无空字符串的列:

df11 = df1[['2','4']].fillna('').agg('|'.join, 1).str.split('|', expand=True)
df1['5'] = (df11.where(df11.isin(df2['1'].tolist()))
.apply(lambda x: ','.join(set(x.dropna())), axis=1))
df1 = df1[df1['5'].ne('')]
print (df1)
1            2   3        4  5
0  A          NaN   2  x|x|x|y  x
1  B          a|b  56      b|c  b
3  D            h  98        j  h
4  E            g  98      k|h  h
5  F  a|a|a|a|a|b  98      NaN  b

最新更新