Сравните, сколько разных значений на столбцы в 2 фреймах данных

#python #pandas #dataframe #lambda

#python #pandas #фрейм данных #лямбда

Вопрос:

У меня есть 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.

группа равна 1, потому что A против B во второй строке

Ответ №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
  

Комментарии:

1. что, если меня волнуют только их строки пересечения?

2. @Matt-pow Я также включаю строку пересечения

3. Я обновил свой вопрос для df2, чтобы добавить дополнительную строку. Ваше решение не игнорирует дополнительную строку.