fusionar pandas dataframe con duplicados clave

Tengo 2 marcos de datos, ambos tienen una columna de clave que podría tener duplicados, pero la mayoría de los marcos de datos tienen las mismas claves duplicadas. Me gustaría fusionar estos marcos de datos en esa clave, pero de tal manera que cuando ambos tengan el mismo duplicado, esos duplicados se fusionen respectivamente. Además, si un dataframe tiene más duplicados de una clave que el otro, me gustaría que los valores se rellenaran como NaN. Por ejemplo:

df1 = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K2', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3', 'A4', 'A5']}, columns=['key', 'A']) df2 = pd.DataFrame({'B': ['B0', 'B1', 'B2', 'B3', 'B4', 'B5', 'B6'], 'key': ['K0', 'K1', 'K2', 'K2', 'K3', 'K3', 'K4']}, columns=['key', 'B']) key A 0 K0 A0 1 K1 A1 2 K2 A2 3 K2 A3 4 K2 A4 5 K3 A5 key B 0 K0 B0 1 K1 B1 2 K2 B2 3 K2 B3 4 K3 B4 5 K3 B5 6 K4 B6 

Estoy tratando de obtener la siguiente salida

  key AB 0 K0 A0 B0 1 K1 A1 B1 2 K2 A2 B2 3 K2 A3 B3 6 K2 A4 NaN 8 K3 A5 B4 9 K3 NaN B5 10 K4 NaN B6 

Básicamente, me gustaría tratar las claves K2 duplicadas como K2_1, K2_2, … y luego hacer la combinación how = ‘external’ en los marcos de datos. ¿Alguna idea de cómo puedo lograr esto?

Related of "fusionar pandas dataframe con duplicados clave"

mas rapido de nuevo

 %%cython # using cython in jupyter notebook # in another cell run `%load_ext Cython` from collections import defaultdict import numpy as np def cg(x): cnt = defaultdict(lambda: 0) for j in x.tolist(): cnt[j] += 1 yield cnt[j] def fastcount(x): return [i for i in cg(x)] df1['cc'] = fastcount(df1.key.values) df2['cc'] = fastcount(df2.key.values) df1.merge(df2, how='outer').drop('cc', 1) 

respuesta más rápida; no escalable

 def fastcount(x): unq, inv = np.unique(x, return_inverse=1) m = np.arange(len(unq))[:, None] == inv return (m.cumsum(1) * m).sum(0) df1['cc'] = fastcount(df1.key.values) df2['cc'] = fastcount(df2.key.values) df1.merge(df2, how='outer').drop('cc', 1) 

vieja respuesta

 df1['cc'] = df1.groupby('key').cumcount() df2['cc'] = df2.groupby('key').cumcount() df1.merge(df2, how='outer').drop('cc', 1) 

introduzca la descripción de la imagen aquí