python - seleccionar - Combina dos marcos de datos por índice
seleccionar una columna pandas (5)
Hola, tengo los siguientes marcos de datos:
> df1
id begin conditional confidence discoveryTechnique
0 278 56 false 0.0 1
1 421 18 false 0.0 1
> df2
concept
0 A
1 B
¿Cómo me fusiono en los índices para obtener:
id begin conditional confidence discoveryTechnique concept
0 278 56 false 0.0 1 A
1 421 18 false 0.0 1 B
Pregunto porque entiendo que
merge()
es decir,
df1.merge(df2)
usa columnas para hacer la correspondencia.
De hecho, al hacer esto obtengo:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/pandas/core/frame.py", line 4618, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 58, in merge
copy=copy, indicator=indicator)
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 491, in __init__
self._validate_specification()
File "/usr/local/lib/python2.7/dist-packages/pandas/tools/merge.py", line 812, in _validate_specification
raise MergeError(''No common columns to perform merge on'')
pandas.tools.merge.MergeError: No common columns to perform merge on
¿Es una mala práctica fusionarse en el índice? ¿Es imposible? Si es así, ¿cómo puedo cambiar el índice a una nueva columna llamada "índice"?
Gracias
Si desea unir dos marcos de datos en pandas, simplemente puede usar los atributos disponibles como
merge
o
concatenate
.
Por ejemplo, si tengo dos marcos de datos
df1
y
df2
, puedo unirlos de la siguiente manera:
newdataframe=merge(df1,df2,left_index=True,right_index=True)
Un error tonto que me atrapó: las uniones fallaron porque los tipos de índice diferían. Esto no era obvio ya que ambas tablas eran tablas dinámicas de la misma tabla original. Después de reset_index, los índices se veían idénticos en jupyter. Solo salió a la luz al guardar para sobresalir ...
Solucionado con:
df1[[''key'']] = df1[[''key'']].apply(pd.to_numeric)
¡Ojalá esto le ahorre a alguien una hora!
Use
merge
, que es la unión interna de forma predeterminada:
pd.merge(df1, df2, left_index=True, right_index=True)
O
join
, que se deja unir por defecto:
df1.join(df2)
O
concat
, que es la unión externa por defecto:
pd.concat([df1, df2], axis=1)
Muestras :
df1 = pd.DataFrame({''a'':range(6),
''b'':[5,3,6,9,2,4]}, index=list(''abcdef''))
print (df1)
a b
a 0 5
b 1 3
c 2 6
d 3 9
e 4 2
f 5 4
df2 = pd.DataFrame({''c'':range(4),
''d'':[10,20,30, 40]}, index=list(''abhi''))
print (df2)
c d
a 0 10
b 1 20
h 2 30
i 3 40
#default inner join
df3 = pd.merge(df1, df2, left_index=True, right_index=True)
print (df3)
a b c d
a 0 5 0 10
b 1 3 1 20
#default left join
df4 = df1.join(df2)
print (df4)
a b c d
a 0 5 0.0 10.0
b 1 3 1.0 20.0
c 2 6 NaN NaN
d 3 9 NaN NaN
e 4 2 NaN NaN
f 5 4 NaN NaN
#default outer join
df5 = pd.concat([df1, df2], axis=1)
print (df5)
a b c d
a 0.0 5.0 0.0 10.0
b 1.0 3.0 1.0 20.0
c 2.0 6.0 NaN NaN
d 3.0 9.0 NaN NaN
e 4.0 2.0 NaN NaN
f 5.0 4.0 NaN NaN
h NaN NaN 2.0 30.0
i NaN NaN 3.0 40.0
por defecto:
unirse es una combinación izquierda en columna
pd.merge es una combinación interna en columnas
pd.concat es una combinación externa en fila
pd.concat:
toma argumentos Iterables.
Por lo tanto, no puede tomar DataFrames directamente (use [df, df2])
Las dimensiones de DataFrame deben coincidir a lo largo del eje
Únete y pd.merge:
puede tomar argumentos de DataFrame
puede usar concat para concatenar dos o más DF alineados por índices:
pd.concat([df1, df2, df3, ...], axis=1)
o merge para concatenar por campos / índices personalizados:
# join by _common_ columns: `col1`, `col3`
pd.merge(df1, df2, on=[''col1'',''col3''])
# join by: `df1.col1 == df2.index`
pd.merge(df1, df2, left_on=''col1'' right_index=True)
o join para unirse por índice:
df1.join(df2)