我有一个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.where
和Series.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')