Как объединить словари информационного кадра pandas при группировании по строкам - PullRequest
0 голосов
/ 12 октября 2018

У меня есть фрейм данных в форме:

id date     area1              area2
01 20181010 {'a': 10, 'b': 15} {'a': 20, 'c': 13}
01 20181010 {'c': 17}          {'b': 12}  
02 20180506 {'a': 2, 'b': 3}   {'c': 4}
02 20180506 Nan                {'a': 18}

Я хотел бы сгруппировать все строки с совпадающими 'id' и 'date', объединяя словари 'area1' и 'area2'.Это означает, что я хотел бы получить:

  id date     area1                       area2
  01 20181010 {'a': 10, 'b': 15, 'c': 17} {'a': 20, 'c': 13, 'b': 12}
  02 20180506 {'a': 2, 'b': 3}            {'c': 4, 'a': 18}

Сначала я пытался что-то вроде:

merged_df = df.groupby(["id", "date"],as_index=False).agg({'area1':'first', 'area2': 'first'}) 

Очевидно, что это только первый диктант area1 и area2.Но если я правильно понимаю, что можно передать функцию в agg, можно ли будет таким образом объединить словари?Я просто не могу сказать, чтобы он взял следующий дикт и объединил его (учитывая, что он может не существовать и быть наном).

Большое спасибо!

Ааатакже было бы здорово, если бы решение не было супер медленным, так как я должен сделать это для большого набора данных: /

1 Ответ

0 голосов
/ 12 октября 2018

Вы почти у цели.Вам просто нужно использовать пользовательскую функцию, которая объединяет словари по значениям непустых рядов:

def merge_dicts(x):
    return {k: v for d in x.dropna() for k, v in d.items()}

res = df.groupby(['id', 'date'], as_index=False).agg(merge_dicts)

print(res)

   id      date                        area1                        area2
0  01  20181010  {'a': 10, 'b': 15, 'c': 17}  {'a': 20, 'c': 13, 'b': 12}
1  02  20180506             {'a': 2, 'b': 3}            {'c': 4, 'a': 18}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...