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.