Menggunakan ini sebagai titik awal:
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
df = pd.DataFrame(a, columns=['one', 'two', 'three'])
Out[8]:
one two three
0 10 1.2 4.2
1 15 70 0.03
2 8 5 0
Saya ingin menggunakan sesuatu seperti if
pernyataan di dalam panda.
if df['one'] >= df['two'] and df['one'] <= df['three']:
df['que'] = df['one']
Pada dasarnya, periksa setiap baris melalui if
pernyataan, buat kolom baru.
Dokumen mengatakan untuk menggunakan .all
tetapi tidak ada contoh ...
python
pandas
if-statement
dataframe
Merlin
sumber
sumber
if
pernyataan ituFalse
?object
. Hal ini memungkinkan objek Python yang sewenang-wenang untuk disimpan di kolom, tetapi itu datang dengan biaya komputasi numerik yang lebih lambat. Jadi, jika kolom menyimpan data numerik, lebih disukai menggunakan NaN untuk bukan-bilangan.a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']]
. Ini menciptakan hasil yang membingungkan dengan kode "benar":df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])]
hasil10
untuk baris pertama, sementara itu akan menghasilkanNaN
jika masukan adalah bilangan bulat.Jawaban:
Anda bisa menggunakan np.where . If
cond
adalah array boolean, danA
danB
adalah array, makamendefinisikan C sama dengan
A
wherecond
adalah True, danB
wherecond
is False.import numpy as np import pandas as pd a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three']) df['que'] = np.where((df['one'] >= df['two']) & (df['one'] <= df['three']) , df['one'], np.nan)
hasil
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Jika Anda memiliki lebih dari satu kondisi, maka Anda dapat menggunakan np.select . Misalnya, jika Anda ingin
df['que']
menyamakandf['two']
kapandf['one'] < df['two']
, makaconditions = [ (df['one'] >= df['two']) & (df['one'] <= df['three']), df['one'] < df['two']] choices = [df['one'], df['two']] df['que'] = np.select(conditions, choices, default=np.nan)
hasil
one two three que 0 10 1.2 4.2 10 1 15 70 0.03 70 2 8 5 0 NaN
Jika kita dapat mengasumsikan bahwa
df['one'] >= df['two']
whendf['one'] < df['two']
is False, maka kondisi dan pilihan dapat disederhanakan menjadiconditions = [ df['one'] < df['two'], df['one'] <= df['three']] choices = [df['two'], df['one']]
(Asumsi tersebut mungkin tidak benar jika
df['one']
ataudf['two']
mengandung NaN.)Catat itu
a = [['10', '1.2', '4.2'], ['15', '70', '0.03'], ['8', '5', '0']] df = pd.DataFrame(a, columns=['one', 'two', 'three'])
mendefinisikan DataFrame dengan nilai string. Karena terlihat numerik, Anda mungkin lebih baik mengubah string tersebut menjadi float:
df2 = df.astype(float)
Ini mengubah hasil, karena string membandingkan karakter demi karakter, sementara float dibandingkan secara numerik.
In [61]: '10' <= '4.2' Out[61]: True In [62]: 10 <= 4.2 Out[62]: False
sumber
Anda dapat menggunakan
.equals
untuk kolom atau seluruh kerangka data.df['col1'].equals(df['col2'])
Jika mereka sama, pernyataan itu akan kembali
True
, jika tidakFalse
.sumber
Anda bisa menggunakan apply () dan melakukan sesuatu seperti ini
df['que'] = df.apply(lambda x : x['one'] if x['one'] >= x['two'] and x['one'] <= x['three'] else "", axis=1)
atau jika Anda memilih untuk tidak menggunakan lambda
def que(x): if x['one'] >= x['two'] and x['one'] <= x['three']: return x['one'] return '' df['que'] = df.apply(que, axis=1)
sumber
Salah satu caranya adalah dengan menggunakan deret Boolean untuk mengindeks kolom
df['one']
. Ini memberi Anda kolom baru di manaTrue
entri memiliki nilai yang sama dengan baris yang sama sepertidf['one']
danFalse
nilainyaNaN
.Seri Boolean hanya diberikan oleh
if
pernyataan Anda (meskipun ini perlu digunakan&
sebagai penggantiand
):>>> df['que'] = df['one'][(df['one'] >= df['two']) & (df['one'] <= df['three'])] >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 NaN 2 8 5 0 NaN
Jika Anda ingin
NaN
nilai diganti dengan nilai lain, Anda dapat menggunakanfillna
metode di kolom baruque
. Saya telah menggunakan0
sebagai pengganti string kosong di sini:>>> df['que'] = df['que'].fillna(0) >>> df one two three que 0 10 1.2 4.2 10 1 15 70 0.03 0 2 8 5 0 0
sumber
Bungkus setiap kondisi individu dalam tanda kurung, lalu gunakan
&
operator untuk menggabungkan ketentuan:df.loc[(df['one'] >= df['two']) & (df['one'] <= df['three']), 'que'] = df['one']
Anda dapat mengisi baris yang tidak cocok dengan hanya menggunakan
~
(operator "bukan") untuk membalikkan kecocokan:df.loc[~ ((df['one'] >= df['two']) & (df['one'] <= df['three'])), 'que'] = ''
Anda perlu menggunakan
&
dan~
daripadaand
dannot
karena operator&
and~
bekerja elemen demi elemen.Hasil akhir:
df Out[8]: one two three que 0 10 1.2 4.2 10 1 15 70 0.03 2 8 5 0
sumber
Gunakan
np.select
jika Anda memiliki beberapa kondisi untuk diperiksa dari dataframe dan keluaran pilihan tertentu di kolom yang berbedaconditions=[(condition1),(condition2)] choices=["choice1","chocie2"] df["new column"]=np.select=(condtion,choice,default=)
Catatan: Tidak ada ketentuan dan tidak ada pilihan yang cocok, ulangi teks yang dipilih jika untuk dua ketentuan berbeda Anda memiliki pilihan yang sama
sumber
Saya pikir yang paling dekat dengan intuisi OP adalah pernyataan inline if:
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three']))
sumber
df['que'] = (df['one'] if ((df['one'] >= df['two']) and (df['one'] <= df['three'])) ^ SyntaxError: unexpected EOF while parsing
Gunakan ekspresi lambda:
df[df.apply(lambda x: x['col1'] != x['col2'], axis = 1)]
sumber