突出显示熊猫中每一行的逐列差异

sge*_*tim 2 python dataframe pandas

假设我有一个pd.DataFrame看起来像这样的:

id  col1_a  col1_b  col2_a  col2_b
1   x       x       2       3  
2   z       d       4       5
3   y       y       9       9
4   p       p       8       1
Run Code Online (Sandbox Code Playgroud)

此数据框代表的是 2 个数据框 ( df_a, df_b) 逐列比较。

我正在尝试获取一个突出显示并查找包含这些差异的列的数据框:

id  col1_a  col1_b  col2_a  col2_b   diff
1   x       x       2       3        col2
2   z       d       4       5        col1,col2
3   y       y       9       9        None
4   p       p       8       1        col2
Run Code Online (Sandbox Code Playgroud)

我怎样才能在不必双重遍历列和行的情况下实现这样的事情。

我知道我可以通过做类似的事情(未测试)来实现这一点:

for col_ptr1 in df.columns:
   for col_ptr2 in df.columns:
      for idx, row in df.iterrows():
         if col_ptr1.strip('_a') == col_ptr2.strip('_b'):
            blah blah blah...
Run Code Online (Sandbox Code Playgroud)

这个超级丑。我想知道是否有更多pandas风格的方法来解决这个问题。

Shu*_*rma 6

选择包含的列子集col,然后split这些列名围绕分隔符_并提取split使用str访问器的第一个组件

现在,group在数据框col使用在上一步中提取前缀,AGGnunique沿axis=1计数unqiue值。如果不等于 1,则检查唯一值,然后使用在 diff 列中添加相应的列名dataframe.dot

c = df.filter(regex=r'_(a|b)$')
m = c.groupby(c.columns.str.split('_').str[0], axis=1).nunique().ne(1)
df['diff'] = m.dot(m.columns + ',').str[:-1]
Run Code Online (Sandbox Code Playgroud)
   id col1_a col1_b  col2_a  col2_b       diff
0   1      x      x       2       3       col2
1   2      z      d       4       5  col1,col2
2   3      y      y       9       9           
3   4      p      p       8       1       col2
Run Code Online (Sandbox Code Playgroud)