Ich versuche eine Zusammenführung zwischen zwei Datenrahmen. Jeder Datenrahmen hat zwei Indexebenen (Datum, Cusip). In den Spalten stimmen einige Spalten beispielsweise zwischen den beiden überein (Währung, Einstellungsdatum).
Was ist der beste Weg, um diese nach Index zusammenzuführen, aber nicht zwei Kopien der Währung und des Adj-Datums zu nehmen.
Jeder Datenrahmen besteht aus 90 Spalten, daher versuche ich zu vermeiden, dass alles von Hand geschrieben wird.
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
...
Wenn ich mache:
dfNew = merge(df, df2, left_index=True, right_index=True, how='outer')
Ich bekomme
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
Vielen Dank! ...
Ich benutze die
suffixes
Option in.merge()
:dfNew = df.merge(df2, left_index=True, right_index=True, how='outer', suffixes=('', '_y')) dfNew.drop(dfNew.filter(regex='_y$').columns.tolist(),axis=1, inplace=True)
Danke @ijoseph
quelle
filter
ing enthalten würde (was ziemlich einfach ist, aber dennoch zeitaufwändig nachzuschlagen / fehleranfällig, um sich zu erinnern). dhdfNew.drop(list(dfNew.filter(regex='_y$')), axis=1, inplace=True)
Ich bin frisch mit Pandas, aber ich wollte das Gleiche erreichen, indem ich Spaltennamen mit _x oder _y automatisch vermeide und doppelte Daten entferne. Ich habe es schließlich durch diese mit Antwort und diese eine von Stackoverflow
sales.csv
Revenue.csv
merge.py Pandas importieren
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=';')
Wenn ich den Zusammenführungsbefehl ausführe, ersetze ich das
_x
Suffix durch eine leere Zeichenfolge und kann Spalten entfernen, die mit enden_y
output.csv
quelle
Aufbauend auf der Antwort von @ rprog können Sie die verschiedenen Teile des Suffix- und Filterschritts mit einem negativen regulären Ausdruck in einer Zeile kombinieren:
dfNew = df.merge(df2, left_index=True, right_index=True, how='outer', suffixes=('', '_DROP')).filter(regex='^(?!.*_DROP)')
Oder mit
df.join
:dfNew = df.join(df2),lsuffix="DROP").filter(regex="^(?!.*DROP)")
Der reguläre Ausdruck hier behält alles bei, was nicht mit dem Wort "DROP" endet. Verwenden Sie daher nur ein Suffix, das nicht bereits in den Spalten angezeigt wird.
quelle