Панды оставили объединение на дубликаты ключей, но без увеличения количества столбцов - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь объединить два разных фрейма данных, которые я импортировал в python, с пандами.Они являются результатом некоторых наблюдений, которые я сделал.Один из них, однако, содержит и класс, и метод, на который смотрел пользователь, а это означает, что для каждой строки в dataframe1 есть дополнительный dataframe2.Теперь это происходит не в каждой строке, поэтому я не могу просто дублировать строки, но я подумал о том, чтобы добавить еще одну строку каждый раз, когда индекс dataframe2 имеет два одинаковых индекса.Вроде как:

dataframe1 = pd.DataFrame({'index':[1,2,3],'a':['asd','fgh','qwe'],'b':['dsa','hgf','ewq'],'c':['sad','gfh','wqe']})
dataframe1=dataframe1[['index','a','b','c']]
dataframe1
   index    a    b    c
0      1  asd  dsa  sad
1      2  fgh  hgf  gfh
2      3  qwe  ewq  wqe

dataframe2 = pd.DataFrame({'index':[1,1,2,3,3],'d':['zxc','cxz','xzc','zxc','xcz']})
dataframe2=dataframe2[['index','d']]
dataframe2
   index    d
0      1  zxc
1      1  cxz
2      2  xzc
3      3  zxc
4      3  xcz

Ожидаемый результат:

index, a, b, c, d
1, asd, dsa, sad, zxc
1, nan, nan, nan, cxz
2, fgh, hgf, gfh, xzc
3, qwe, ewq, wqe, zxc
3, nan, nan, nan, xcz

Любые встроенные функции для использования?Значения также могут быть значениями предыдущей строки с тем же индексом.

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Использование merge с mask и duplicated:

df = df2.merge(df1)
cols = ['index','a','b','c']
df[['a','b','c']] = df[cols].mask(df[cols].duplicated())[['a','b','c']]

print(df)
   index    d    a    b    c
0      1  zxc  asd  dsa  sad
1      1  cxz  NaN  NaN  NaN
2      2  xzc  fgh  hgf  gfh
3      3  zxc  qwe  ewq  wqe
4      3  xcz  NaN  NaN  NaN
0 голосов
/ 26 декабря 2018

Используйте pd.merge с дополнительным столбцом с накоплением:

u = df2.assign(cnt=df2.groupby('index').cumcount())
v = df.assign(cnt=df.groupby('index').cumcount())

u.merge(v, on=['index', 'cnt'], how='left').drop('cnt', 1)

   index    d    a    b    c
0      1  zxc  asd  dsa  sad
1      1  cxz  NaN  NaN  NaN
2      2  xzc  fgh  hgf  gfh
3      3  zxc  qwe  ewq  wqe
4      3  xcz  NaN  NaN  NaN

Подробности

Мы вводим кумулятивный подсчет для повторяющихся значений в "index".

u = df2.assign(cnt=df2.groupby('index').cumcount())
u
   index    d  cnt
0      1  zxc    0
1      1  cxz    1
2      2  xzc    0
3      3  zxc    0
4      3  xcz    1

v = df.assign(cnt=df.groupby('index').cumcount())
v
   index    a    b    c  cnt
0      1  asd  dsa  sad    0
1      2  fgh  hgf  gfh    0
2      3  qwe  ewq  wqe    0

Затем мы принудительно выполняем левое соединение с u для «index» и «cnt».Таким образом, в результате вводятся NaN:

u.merge(v, on=['index', 'cnt'], how='left')

   index    d  cnt    a    b    c
0      1  zxc    0  asd  dsa  sad
1      1  cxz    1  NaN  NaN  NaN
2      2  xzc    0  fgh  hgf  gfh
3      3  zxc    0  qwe  ewq  wqe
4      3  xcz    1  NaN  NaN  NaN

Последний шаг - удалить временный столбец "cnt".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...