Pandas: получить уникальные элементы, затем объединить - PullRequest
2 голосов
/ 27 января 2020

Я думаю, что это должно быть просто, но мне трудно искать решения этой проблемы, возможно, потому что я не знаю лучшего словарного запаса. Но для иллюстрации скажем, у меня есть три фрейма данных:

df1 = df({'id1':['1','2','3'], 'val1':['a','b','c']})

df2 = df({'id2':['1','2','4'], 'val2':['d','e','f']})

df3 = df({'id3':['1','5','6'], 'val3':['g','h','i']})

То, что я хочу получить, это :

comb_id    val1    val2    val3
1          a       d       g
2          b       e       n.d.
3          c       n.d.    n.d.
4          n.d.    f       n.d.
5          n.d.    n.d.    h
6          n.d.    n.d.    i

Я думаю, что это должно быть какое-то внешнее слияние, но пока я не заставил его работать. Кто-нибудь знает лучший способ go об этом?

1 Ответ

4 голосов
/ 27 января 2020

Используйте concat с DataFrame.set_index для всех DataFrame с:

df = pd.concat([df1.set_index('id1'),
                df2.set_index('id2'),
                df3.set_index('id3')], axis=1, sort=True)
print (df)
  val1 val2 val3
1    a    d    g
2    b    e  NaN
3    c  NaN  NaN
4  NaN    f  NaN
5  NaN  NaN    h
6  NaN  NaN    i

При необходимости замените пропущенные значения, добавьте DataFrame.fillna:

df = pd.concat([df1.set_index('id1'),
                df2.set_index('id2'),
                df3.set_index('id3')], axis=1, sort=True).fillna('n.d.')
print (df)
   val1  val2  val3
1     a     d     g
2     b     e  n.d.
3     c  n.d.  n.d.
4  n.d.     f  n.d.
5  n.d.  n.d.     h
6  n.d.  n.d.     i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...