name inner examples example columns column python pandas

python - inner - Pandas Merge-Cómo evitar la duplicación de columnas



python merge inner join (3)

Estoy intentando fusionar dos marcos de datos. Cada marco de datos tiene dos niveles de índice (fecha, cusip). En las columnas, algunas columnas coinciden entre las dos (moneda, fecha de ajuste), por ejemplo.

Cuál es la mejor manera de fusionar estos por índice, pero no tomar dos copias de moneda y fecha adj.

Cada marco de datos tiene 90 columnas, así que estoy tratando de evitar escribir todo a mano.

df: currency adj_date data_col1 ... date cusip 2012-01-01 XSDP USD 2012-01-03 0.45 ... df2: currency adj_date data_col2 ... date cusip 2012-01-01 XSDP USD 2012-01-03 0.45 ...

Si lo hago:

dfNew = merge(df, df2, left_index=True, right_index=True, how=''outer'')

yo obtengo

dfNew: currency_x adj_date_x data_col2 ... currency_y adj_date_y date cusip 2012-01-01 XSDP USD 2012-01-03 0.45 USD 2012-01-03

¡Gracias! ...


Puede trabajar las columnas que están solo en un marco de datos y usar esto para seleccionar un subconjunto de columnas en la combinación

cols_to_use = df2.columns - df.columns

luego realice la fusión usando esto (tenga en cuenta que este es un objeto de índice pero tiene un práctico método de tolist() )

dfNew = merge(df, df2[cols_to_use], left_index=True, right_index=True, how=''outer'')

Esto evitará que las columnas choquen en la fusión

Para la versión 0.15 y superior, la nueva sintaxis preferida es:

cols_to_use = df2.columns.difference(df.columns)

gracias @odedbd


Soy nuevo con Pandas, pero quería lograr lo mismo, evitando automáticamente los nombres de columna con _x o _y y eliminando los datos duplicados. Finalmente lo hice usando esta answer y esta de

sales.csv

city;state;units Mendocino;CA;1 Denver;CO;4 Austin;TX;2

revenue.csv

branch_id;city;revenue;state_id 10;Austin;100;TX 20;Austin;83;TX 30;Austin;4;TX 47;Austin;200;TX 20;Denver;83;CO 30;Springfield;4;I

merge.py import pandas

def drop_y(df): # list comprehension of the cols that end with ''_y'' to_drop = [x for x in df if x.endswith(''_y'')] df.drop(to_drop, axis=1, inplace=True) sales = pandas.read_csv(''data/sales.csv'', delimiter='';'') revenue = pandas.read_csv(''data/revenue.csv'', delimiter='';'') result = pandas.merge(sales, revenue, how=''inner'', left_on=[''state''], right_on=[''state_id''], suffixes=('''', ''_y'')) drop_y(result) result.to_csv(''results/output.csv'', index=True, index_label=''id'', sep='';'')

Al ejecutar el comando de fusión, reemplazo el sufijo _x con una cadena vacía y puedo eliminar las columnas que terminan con _y

output.csv

id;city;state;units;branch_id;revenue;state_id 0;Denver;CO;4;20;83;CO 1;Austin;TX;2;10;100;TX 2;Austin;TX;2;20;83;TX 3;Austin;TX;2;30;4;TX 4;Austin;TX;2;47;200;TX


Yo uso la opción de suffixes en .merge() :

dfNew = df.merge(df2, left_index=True, right_index=True, how=''outer'', suffixes=('''', ''_y''))

A continuación, puede filtrar las columnas según el indicador "_y", es decir, eliminarlas.