Pandas Логическое индексирование для сравнения DataFrame и результатов в списке Dicts - PullRequest
0 голосов
/ 05 августа 2020

У меня есть следующие фреймы данных

import pandas as pd
import numpy as np

df1 = pd.DataFrame([[70, np.nan, "hello"], [89, 3, 4], [210, 5, 64], [11, 75, 8]], columns=["ID", "A", "B"], dtype='object')

df2 = pd.DataFrame([[70, np.nan, "world"], [89, 33, 44], [21, 5, 6], [11, 7, 8]], columns=["ID","A", "B"], dtype='object')

вывод df1 ниже

    ID    A      B
0   70  NaN  hello
1   89    3      4
2   21    5     64
3   11   75      8

вывод df2 ниже

   ID    A      B
0  70  NaN  world
1  89   33     44
2  21    5      6
3  11    7      8

различия в выделении логической маски

diff_mask = (df1 != df2) & ~(df1.isnull() & df2.isnull())

Результат:

      ID      A      B
0  False  False   True
1  False   True   True
2  False  False   True
3  False   True  False

Как мне получить результат, который создает список dicts идентификаторов и истинных значений для каждой строки? При необходимости я мог бы установить идентификатор в качестве индекса.

окончательный результат будет выглядеть так

[{'ID': 70, 'B': 'world'}, {'ID': 89, 'A': 33, 'B': 44}, {'ID': 21, 'B': 6}, {'ID': 11, 'A': 7}]

1 Ответ

4 голосов
/ 05 августа 2020

Давайте попробуем where, также я рекомендую выходные серии не dict

s=df2.set_index('ID').where(diff_mask.drop('ID',1).values).stack()
Out[74]: 
ID   
70  B    world
89  A       33
    B       44
21  B        6
11  A        7
dtype: object

, чтобы dict

d=[y.unstack().reset_index().to_dict('r')[0] for x , y in s.groupby(level=0)]   
Out[111]: 
[{'ID': 11, 'A': 7},
 {'ID': 21, 'B': 6},
 {'ID': 70, 'B': 'world'},
 {'ID': 89, 'A': 33, 'B': 44}]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...