【问题标题】:Compare how many different values per columns in 2 dataframes比较 2 个数据框中每列有多少不同的值
【发布时间】:2020-08-28 23:20:04
【问题描述】:

我有 2 个数据框,我正在尝试查找每列不同值的数量:

df 1
-----
id  rank    value   group
0   1       999      A
1   2        3       A
2   3       345      B
3   56       8       C
4   7       54       D
_____
df 2
_____
id rank    value    group
0   1      111       A
1   2       3        B
2   3      345       B
3  56       11       C
4   7       2        D
5   4       92       E

我有一个计算差异的函数:

def diff_helper(x):
    if x[0] == x[1]:
        return 'same'
    return 'diff'
merged_df = pd.merge(df1, df2, on = 'id')
merged_df.apply(lambda frame: frame.apply(diff_helper, axis=1))

我们忽略 df2 的最后一行,因为它不与 df1 重叠。我的预期输出是

rank : 0
value: 3
group: 1 

值为 3,因为 999 与 111、8 与 11、54 与 2。

group 为 1,因为 A vs B 在第二行

【问题讨论】:

    标签: python pandas dataframe lambda


    【解决方案1】:

    让我们试试

    df1 = df1.set_index('id') ; df2 = df2.set_index('id')
    df1=df1[df1.index.isin(df2.index)]
    df2=df2[df2.index.isin(df1.index)]
    s = df1.ne(df2)
    # if we only need the number after sum , we are done ~ 
    s.sum()
    Out[9]:
    rank     0
    value    3
    group    1
    dtype: int64
    
    t = pd.concat([df1[s].stack(), df2[s].stack()]).astype(str).groupby(level=[0,1]).agg(' vs '.join).groupby(level=1).agg(','.join)
    out = pd.concat([s.sum(), t],axis=1)
    Out[20]: 
           0                                       1
    rank   0                                     NaN
    value  3  999.0 vs 111.0,8.0 vs 11.0,54.0 vs 2.0
    group  1                                  A vs B
    

    【讨论】:

    • 如果我只关心他们的交叉行怎么办?
    • @Matt-pow 我也包括交叉行
    • 我更新了我的 df2 问题以增加一行。您的解决方案不会忽略多余的行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-13
    • 2016-07-16
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 2021-10-08
    • 1970-01-01
    相关资源
    最近更新 更多