从两个完全相似的pandas Dataframe 中选择不匹配的列和值

i2loujxw  于 2023-03-28  发布在  其他
关注(0)|答案(2)|浏览(113)

我想从两个完全相似的 Dataframe 中选择不匹配的列及其值。

import pandas as pd

list1 = [['a', 'key1', 'b', 'c', 'd'], ['w', 'key2', 'x',   'y', 'z']] 

list2 = [['a', 'key1', 'b', 'p', 'q'], ['w', 'key2', 'x',   'y', 'z'], ['w', 'key3', 'i', 'j', 'k']] 
  
# creating df object with columns specified    
df1 = pd.DataFrame(list1, columns =['col_1', 'key_col', 'col_2', 'col_3', 'col_4']) 
print(df1.to_string())
df2 = pd.DataFrame(list2, columns =['col_1', 'key_col', 'col_2', 'col_3', 'col_4']) 
print(df2.to_string())

我现在拥有的:

列_1键列第二栏第三列第四栏
a键1Bcd
w键2xyz
列_1键列第二栏第三列第四栏
----------------------------------------------------------------------
a键1Bpq
w键2xyz
w键3jk

我有来自不同数据源的相同模式的2个 Dataframe 。

我想要的

使用“key_col”作为连接键连接(外部连接)2个 Dataframe ,并以以下格式给予输出:
对于联接后获得的表中的每一行,返回以下行:
| 键列|列名不匹配|第一个df中的值不匹配|秒df中的值不匹配|
| --------------|--------------|--------------|--------------|
| 键1|[第3栏、第4栏]|[c、d]|[p,q]|
| 键3|[col1,col2,col3,col4]|【无无无无】|[w,i,j,k]|
我正在寻找的查询这样做的Pandas。

lsmepo6l

lsmepo6l1#

一个选项:

# align the DataFrames
idx = pd.concat([df1['key_col'], df2['key_col']]).unique()

d1 = df1.set_index('key_col').reindex(idx)
d2 = df2.set_index('key_col').reindex(idx)

# get mask for different values
m = d1.ne(d2).stack()

# compute the output
out = pd.DataFrame(
  {'mismatched_column_names': m.reset_index(1).loc[m.values, 'level_1'].groupby(level=0).agg(list),
   'mismatched_values_in_first_df': d1.stack(dropna=False)[m].droplevel(1).groupby(level=0).agg(list),
   'mismatched_values_in_second_df': d2.stack(dropna=False)[m].droplevel(1).groupby(level=0).agg(list)}
).reset_index()

输出:

key_col       mismatched_column_names mismatched_values_in_first_df mismatched_values_in_second_df
0    key1                [col_3, col_4]                        [c, d]                         [p, q]
1    key3  [col_1, col_2, col_3, col_4]          [nan, nan, nan, nan]                   [w, i, j, k]
x4shl7ld

x4shl7ld2#

所以按照你的例子来设置问题

import pandas as pd

list1 = [['a', 'key1', 'b', 'c', 'd'], ['w', 'key2', 'x',   'y', 'z']] 

list2 = [['a', 'key1', 'b', 'p', 'q'], ['w', 'key2', 'x',   'y', 'z'], ['w', 'key3', 'i', 'j', 'k']] 
  
# creating df object with columns specified    
df1 = pd.DataFrame(list1, columns =['col_1', 'key_col', 'col_2', 'col_3', 'col_4']) 
print(df1.to_string())
df2 = pd.DataFrame(list2, columns =['col_1', 'key_col', 'col_2', 'col_3', 'col_4']) 
print(df2.to_string())

这个

col_1 key_col col_2 col_3 col_4
0     a    key1     b     c     d
1     w    key2     x     y     z
  col_1 key_col col_2 col_3 col_4
0     a    key1     b     p     q
1     w    key2     x     y     z
2     w    key3     i     j     k

现在看一个外部合并

m = df1.merge(df2, on='key_col', how='outer', suffixes=['df1', 'df2'], indicator=True)

会给予你这个

col_1df1    key_col col_2df1    col_3df1    col_4df1    col_1df2    col_2df2    col_3df2    col_4df2    _merge
0   a   key1    b   c   d   a   b   p   q   both
1   w   key2    x   y   z   w   x   y   z   both
2   NaN key3    NaN NaN NaN w   i   j   k   right_only

现在提取差异只是在列中运行...

相关问题