Saya baru saja menemukan 2 masalah yang menyebabkan ini, lihat solusi di bawah

Saya ingin membuat kolom baru di kerangka data (df) saya berdasarkan kerangka data lain. Pada dasarnya df2 berisi informasi terbaru yang ingin saya masukkan ke df. Untuk mereplikasi kasus saya yang sebenarnya (>1m baris), saya hanya akan mengisi dua df acak dengan kolom sederhana.

Saya menggunakan pandas.merge() untuk melakukan ini, tetapi ini memberi saya hasil yang aneh.

Berikut adalah contoh tipikal. Mari kita buat df secara acak dan buat df2 dengan hubungan sederhana : "Tipe Baru" = "Tipe" + 1. Saya membuat hubungan sederhana ini agar kita dapat memeriksa output dengan mudah. Dalam aplikasi saya yang sebenarnya, tentu saja saya tidak memiliki hubungan yang mudah.

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,100,size=(100, 1)),columns = ["Type"])
df.head()

   Type
0    45
1     3
2    89
3     6
4    39

df1 = pd.DataFrame({"Type":range(1,100)})
df1["New Type"] = df1["Type"] + 1
print(df1.head())

 Type  New Type
0     1         2
1     2         3
2     3         4
3     4         5
4     5         6

Sekarang katakanlah saya ingin memperbarui df "Jenis" berdasarkan "Tipe Baru" di df1

df["Type2"] = df.merge(df1,on="Type")["New Type"]
print(df.head())

Saya mendapatkan output aneh ini di mana kami dengan jelas melihat bahwa itu tidak berfungsi

  Type  Type2
0    45   46.0
1     3    4.0
2    89    4.0
3     6    4.0
4    39   90.0

Saya akan berpikir output harus seperti

  Type  Type2
0    45   46.0
1     3    4.0
2    89   90.0
3     6    7.0
4    39   40.0

Hanya baris pertama yang cocok dengan benar. Apakah Anda tahu apa yang saya lewatkan?

Larutan

1.Saya perlu melakukan penggabungan dengan how="kiri" jika tidak, pilihan default adalah "dalam" menghasilkan tabel lain dengan dimensi yang berbeda dari df.

  1. Saya juga perlu menggunakan sort=false sebagai atribut untuk fungsi penggabungan saya. Jika tidak, hasil penggabungan diurutkan sebelum diterapkan ke df.
2
Nicolas 17 Agustus 2017, 17:04

2 jawaban

Jawaban Terbaik

Salah satu cara Anda dapat melakukannya menggunakan map, set_index, dan squeeze:

df['Type2'] = df['Type'].map(df1.set_index('Type').squeeze())

Keluaran:

   Type  Type2
0    22   23.0
1    56   57.0
2    63   64.0
3    33   34.0
4    25   26.0
1
Scott Boston 17 Agustus 2017, 14:23

Pertama, saya akan membuat Seri New Type yang diindeks oleh Type lama dari df1:

new_vals = df1.set_index('Type')['New Type']

Maka itu hanya:

df.replace(new_vals)

Itu akan meninggalkan nilai yang tidak dipetakan secara utuh. Jika Anda ingin agar output menjadi NaN (null) jika tidak dipetakan, lakukan ini:

new_vals[df.Type]
0
John Zwinck 17 Agustus 2017, 14:13