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

Danke dir! ...

98
user1911092 2 Okt. 2013 im 00:16

3 Antworten

Beste Antwort

Sie können die Spalten berechnen, die sich nur in einem DataFrame befinden, und damit eine Teilmenge der Spalten in der Zusammenführung auswählen.

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

Führen Sie dann die Zusammenführung durch (beachten Sie, dass dies ein Indexobjekt ist, aber eine praktische tolist() Methode hat).

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

Dadurch wird vermieden, dass Spalten beim Zusammenführen zusammenstoßen.

119
Ninjakannon 2 Dez. 2019 im 14:24

Ich verwende die Option suffixes in {{X1 }}:

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

Sie können die Spalten dann basierend auf dem Flag "_y" filtern, d. H. Löschen.

64
MERose 20 Juli 2016 im 00:48

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 getan, indem ich diese Antwort und diese eins von Stackoverflow

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 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 Suffix _x durch eine leere Zeichenfolge und kann Spalten entfernen, die mit _y enden.

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
4
JulienD 22 Nov. 2017 im 15:56