我有一個相當復雜的 If 陳述句,我想在我的 pandas 資料框中添加一個列。過去我一直使用 numpy.select 來解決這類問題,但是我不知道如何使用多行 if 陳述句來實作。
我能夠在Excel中得到這個:
=IF(sum1=3,IF(AND(col1=col2,col2=col3),0,1),IF(sum1=2,IF(OR(col1=col2,col2=col3,col1=col3),0,1),IF(sum1=1,0,1)))
并用 Python 將其撰寫為常規的多行“if 陳述句”,只是想了解是否有更簡潔的方式來呈現它。
if df['sum1'] == 3:
if df['col1'] == df['col2'] and df['col2'] == df['col3']:
df['verify_col'] = 0
else:
df['verify_col'] = 1
elif df['sum1'] == 2:
if df['col1'] == df['col2'] or df['col2'] == df['col3'] or df['col1'] == df['col3']:
df['verify_col'] = 0
else:
df['verify_col'] = 1
elif df['sum1'] == 1:
df['verify_col'] = 0
else:
df['verify_col'] = 1
以下是一些示例資料:
df = pd.DataFrame({
'col1': ['BMW', 'Mercedes Benz', 'Lamborghini', 'Ferrari', null],
'col2': ['BMW', 'Mercedes Benz', null, null, 'Tesla'],
'col3': ['BMW', 'Mercedes', 'Lamborghini', null, 'Tesla_'],
'sum1': [3, 3, 2, 1, 2]
})
我想要一個具有以下結果的列:
'verify_col': [0, 1, 0, 0, 1]
它基本上檢查列是否與其中具有值的列匹配,并為每一行分配 1 或 0。1 表示它們不同,0 表示零差異。
uj5u.com熱心網友回復:
numpy.where與鏈掩碼一起使用for|按位OR- 如果不匹配,則創建任何條件1:
m1 = (df['sum1'] == 3)
m2 = (df['col1'] == df['col2']) & (df['col2'] == df['col3'])
m3 = (df['sum1'] == 2)
m4 = (df['col1'] == df['col2']) | (df['col2'] == df['col3']) | (df['col1'] == df['col3'])
m5 = df['sum1'] == 1
df['verify_col'] = np.where((m1 & m2) | (m3 & m4) | m5, 0, 1)
如果None不符合任何條件則需要:
df['verify_col'] = np.select([(m1 & m2) | (m3 & m4) | m5,
(m1 & ~m2) | (m3 & ~m4) | ~m5],
[0,1], default=None)
print (df)
col1 col2 col3 sum1 verify_col
0 BMW BMW BMW 3 0
1 Mercedes Benz Mercedes Benz Mercedes 3 1
2 Lamborghini NaN Lamborghini 2 0
3 Ferrari NaN NaN 1 0
4 NaN Tesla Tesla_ 2 1
uj5u.com熱心網友回復:
一種選擇是使用pyjanitor的case_when:
# pip install pyjanitor
import pandas as pd
import janitor
(df
.case_when(
# condition, result
df.sum1.eq(3) & df.col1.eq(df.col2) & df.col2.eq(df.col3), 0,
df.sum1.eq(3), 1,
df.sum1.eq(2) & (df.col1.eq(df.col2) | df.col2.eq(df.col3) | df.col1.eq(df.col3)), 0,
df.sum1.eq(2), 1,
df.sum1.eq(1), 0,
1, # default
column_name='verify_col')
)
col1 col2 col3 sum1 verify_col
0 BMW BMW BMW 3 0
1 Mercedes Benz Mercedes Benz Mercedes 3 1
2 Lamborghini None Lamborghini 2 0
3 Ferrari None None 1 0
4 None Tesla Tesla_ 2 1
當然,你可以這樣做np.select:
conditions = [df.sum1.eq(3) & df.col1.eq(df.col2) & df.col2.eq(df.col3),
df.sum1.eq(3),
df.sum1.eq(2) & (df.col1.eq(df.col2) | df.col2.eq(df.col3) |
df.col1.eq(df.col3)),
df.sum1.eq(2),
df.sum1.eq(1)]
results = [0,1,0,1,0]
outcome = np.select(conditions, results, default=1)
df.assign(verify_col = outcome)
col1 col2 col3 sum1 verify_col
0 BMW BMW BMW 3 0
1 Mercedes Benz Mercedes Benz Mercedes 3 1
2 Lamborghini None Lamborghini 2 0
3 Ferrari None None 1 0
4 None Tesla Tesla_ 2 1
uj5u.com熱心網友回復:
df['verify_col'] = (~(((df["col1"] == df["col2"]) | df["col1"].isna() | df["col2"].isna()) & ((df["col2"] == df["col3"]) | df["col2"].isna() | df["col3"].isna()))).astype(int)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/519636.html
標籤:Python熊猫麻木的
