比较熊猫数据帧中的两个并排列,并同时为所选单元格着色



我有一个DataFrame,比如df

data = [['00898','22123'],['87','99878'],['22123','66454'],['00898','87'],
['2109','312'],['6412','3078'],['6412','3078'],['66454','03158'],['3268','87']]
df = pd.DataFrame(data,columns = ['emp_ids','master_emp_ids'])
df
emp_ids    master_emp_ids
0   00898   22123
1   87      99878
2   22123   66454
3   00898   87
4   2109    312
5   6412    3078
6   6412    3078
7   66454   03158
8   3268    87

现在我想检查列emp_ids的所有id是否都存在于列master_emp_ids中。因此,emp_ids的每个id都应该与master_emp_ids的每个id进行比较。并且应该创建一个名为status的列,其中如果存在则给出yes,如果不存在则给出no。基本上,第一列中的87存在于第二列中,所以它是肯定的,并且在它说"是"的地方将特定的细胞染成绿色。所以我的最后一个DataFrame应该是-df

data = [['no','00898','22123'],['yes','87','99878'],['yes','22123','66454'],['no','00898','87'],
['no','2109','312'],['no','6412','3078'],['no','6412','3078'],['yes','66454','03158'],['no','3268','87']]
df = pd.DataFrame(data,columns = ['Status','emp_ids','master_emp_ids'])
df
status  emp_ids   master_emp_ids
0   no  00898     22123
1   yes 87        99878
2   yes 22123     66454
3   no  00898     87
4   no  2109      312
5   no  6412      3078
6   no  6412      3078
7   yes 66454     03158
8   no  3268      87

请帮我拿到我想要的OP.

谢谢!!!

使用numpy.whereSeries.isin添加新的最后一列:

df['status'] = np.where(df['emp_ids'].isin(df['master_emp_ids']), 'yes','no')
print (df)
Status emp_ids master_emp_ids status
0     no   00898          22123     no
1    yes      87          99878    yes
2    yes   22123          66454    yes
3     no   00898             87     no
4     no    2109            312     no
5     no    6412           3078     no
6     no    6412           3078     no
7    yes   66454          03158    yes
8     no    3268             87     no

如果需要第一列,请使用DataFrame.insert:

df.insert(0, 'status',  np.where(df['emp_ids'].isin(df['master_emp_ids']), 'yes','no'))
print (df)
status Status emp_ids master_emp_ids
0     no     no   00898          22123
1    yes    yes      87          99878
2    yes    yes   22123          66454
3     no     no   00898             87
4     no     no    2109            312
5     no     no    6412           3078
6     no     no    6412           3078
7    yes    yes   66454          03158
8     no     no    3268             87

编辑:对于着色是可能的使用风格:

def color(val):
if val == 'yes':
return 'background-color: green'
elif val == 'no':
return 'background-color: red'
else:
return ''

df.insert(0, 'status',  np.where(df['emp_ids'].isin(df['master_emp_ids']), 'yes','no'))
df.style.applymap(color).to_excel('styled.xlsx', engine='openpyxl')

最新更新