Saya mencoba menggabungkan antara dua bingkai data. Setiap frame data memiliki dua level indeks (tanggal, cusip). Di kolom, beberapa kolom cocok antara keduanya (mata uang, tanggal penyerahan) misalnya.
Apa cara terbaik untuk menggabungkan ini dengan indeks, tetapi tidak mengambil dua salinan mata uang dan tanggal adj.
Setiap bingkai data terdiri dari 90 kolom, jadi saya mencoba untuk tidak menulis semuanya dengan tangan.
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
...
Bila saya lakukan:
dfNew = merge(df, df2, left_index=True, right_index=True, how='outer')
saya mendapat
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
Terima kasih! ...
Saya menggunakan
suffixes
opsi dalam.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)
Terima kasih @ijoseph
sumber
filter
ing (yang cukup mudah, namun masih memakan waktu untuk mencari / rawan kesalahan untuk mengingat). yaitudfNew.drop(list(dfNew.filter(regex='_y$')), axis=1, inplace=True)
Saya baru mengenal Pandas tetapi saya ingin mencapai hal yang sama, secara otomatis menghindari nama kolom dengan _x atau _y dan menghapus data duplikat. Aku akhirnya melakukannya dengan menggunakan ini jawaban dan ini salah satu dari Stackoverflow
sales.csv
revenue.csv
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=';')
Saat menjalankan perintah merge, saya mengganti
_x
sufiks dengan string kosong dan saya dapat menghapus kolom yang diakhiri dengan_y
output.csv
sumber
Berdasarkan jawaban @ rprog, Anda dapat menggabungkan berbagai langkah sufiks & filter ke dalam satu baris menggunakan regex negatif:
dfNew = df.merge(df2, left_index=True, right_index=True, how='outer', suffixes=('', '_DROP')).filter(regex='^(?!.*_DROP)')
Atau menggunakan
df.join
:dfNew = df.join(df2),lsuffix="DROP").filter(regex="^(?!.*DROP)")
Regex di sini menyimpan apa pun yang tidak diakhiri dengan kata "DROP", jadi pastikan untuk menggunakan sufiks yang belum muncul di antara kolom.
sumber