Saya memiliki DataFrame df
:
A B
a 2 2
b 3 1
c 1 3
Saya ingin membuat kolom baru berdasarkan kriteria berikut:
jika baris A == B: 0
jika barisA > B: 1
jika baris A < B: -1
Jadi mengingat tabel di atas, seharusnya:
A B C
a 2 2 0
b 3 1 1
c 1 3 -1
Untuk if else
kasus - kasus umum yang saya lakukan np.where(df.A > df.B, 1, -1)
, apakah panda menyediakan sintaks khusus untuk menyelesaikan masalah saya dengan satu langkah (tanpa perlu membuat 3 kolom baru dan kemudian menggabungkan hasilnya)?
python
pandas
conditional
gila
sumber
sumber
apply
dan mengaturnyaaxis=1
akan berhasil, saya tidak yakin saya bisa memikirkan operasi yang akan memberi Anda apa yang Anda inginkandf['C']=df.apply(myFunc(row), axis=1)
mana myFunc melakukan apa yang Anda inginkan, ini tidak melibatkan pembuatan '3 kolom'Jawaban:
Untuk memformalkan beberapa pendekatan yang diuraikan di atas:
Buat fungsi yang beroperasi pada baris dataframe Anda seperti ini:
def f(row): if row['A'] == row['B']: val = 0 elif row['A'] > row['B']: val = 1 else: val = -1 return val
Kemudian terapkan ke dataframe Anda dengan memasukkan
axis=1
opsi:In [1]: df['C'] = df.apply(f, axis=1) In [2]: df Out[2]: A B C a 2 2 0 b 3 1 1 c 1 3 -1
Tentu saja, ini tidak vektor sehingga kinerja mungkin tidak sebaik saat diskalakan ke sejumlah besar rekaman. Namun, menurut saya ini jauh lebih mudah dibaca. Terutama yang berlatar belakang SAS.
Edit
Berikut adalah versi vektornya
df['C'] = np.where( df['A'] == df['B'], 0, np.where( df['A'] > df['B'], 1, -1))
sumber
args
parameter.apply
fungsi: pandas.pydata.org/pandas-docs/stable/generated/…data df; set df; if A=B then C=0; else if A>B then C=1; else C=-1; run;
Sangat elegan dan sederhana.df.loc[df['A'] == df['B'], 'C'] = 0 df.loc[df['A'] > df['B'], 'C'] = 1 df.loc[df['A'] < df['B'], 'C'] = -1
Mudah dipecahkan menggunakan pengindeksan. Baris pertama kode berbunyi demikian, jika kolom
A
sama dengan kolomB
maka buat dan atur kolomC
sama dengan 0.sumber
Untuk hubungan khusus ini, Anda dapat menggunakan
np.sign
:>>> df["C"] = np.sign(df.A - df.B) >>> df A B C a 2 2 0 b 3 1 1 c 1 3 -1
sumber
Katakanlah di atas satu adalah kerangka data asli Anda dan Anda ingin menambahkan kolom baru 'lama'
Jika usia lebih dari 50 maka kami anggap lebih tua = ya jika tidak Salah
langkah 1: Dapatkan indeks baris yang usianya lebih dari 50
row_indexes=df[df['age']>=50].index
langkah 2: Menggunakan .loc kita dapat menetapkan nilai baru ke kolom
df.loc[row_indexes,'elderly']="yes"
sama untuk usia di bawah kurang dari 50 tahun
row_indexes=df[df['age']<50].index
df[row_indexes,'elderly']="no"
sumber