[英]updating cell values with if conditions pandas dataframe
我遇到了一些問題,其中我使用了 for 循環和 if 條件來更新數據框。 它們應該是非常基本的 python 邏輯,但我在網上找不到解釋,所以我想在這里問一下。
出於說明目的,讓我們看一個簡單的數據框 df:
1 2
0 1 0
1 0 1
2 1 0
3 0 0
4 1 1
我想要基於前兩列值的第三列:
最初我寫道:
for i in range(len(df)):
if df.loc[i,'1']==1 & df.loc[i,'2']==0:
df.loc[i,'3']=1
else:
df.loc[i,'3']=0
但我得到了這個:
1 2 3
0 1 0 0.0
1 0 1 0.0
2 1 0 0.0
3 0 0 1.0
4 1 1 0.0
然后我發現當我在我的條件中添加方括號時它起作用了:所以我使用了if df.loc[i,'1']==1 & df.loc[i,'2']==0:
if (df.loc[i,'1']==1) & (df.loc[i,'2']==0):
那么為什么會這樣呢?
此外,我正在測試即使只有一種情況我是否總是需要支架:
for i in range(len(df)):
if df.loc[1,'2']==1:
df.loc[1,'4']=0
else:
df.loc[1,'4']=1
另一個問題發生在我缺少值並且只更新單元格 df.loc[1,'4'] 的地方:
1 2 3 4
0 1 0 1.0 NaN
1 0 1 0.0 0.0
2 1 0 1.0 NaN
3 0 0 0.0 NaN
4 1 1 0.0 NaN
我真的很困惑,這次添加括號並沒有改變任何東西。 為什么會這樣?
除了這兩個問題,我更新單元格值的方法一般來說是錯誤的嗎?
矢量化解決方案是將按位AND
的&
鏈式掩碼轉換為整數,以將True, False
映射到1,0
:
df['3'] = ((df['1'] == 1) & (df['2'] == 0)).astype(int)
您的解決方案使用標量,因此使用and
而不是&
使用數組(不推薦):
for i in range(len(df)):
if df.loc[i,'1']==1 and df.loc[i,'2']==0:
df.loc[i,'3']=1
else:
df.loc[i,'3']=0
print (df)
1 2 3
0 1 0 1.0
1 0 1 0.0
2 1 0 1.0
3 0 0 0.0
4 1 1 0.0
不要使用循環,這是 pandas 中的反模式,使用:
df['3'] = (df['1'].eq(1) & df['2'].eq(0)).astype(int)
df['4'] = df['2'].ne(1).astype(int)
# or, if only 0/1
# df['4'] = 1 - df['2']
此外,使用eq
代替==
避免需要用圓括號括起相等性以尊重運算符優先級。
輸出:
1 2 3 4
0 1 0 1 1
1 0 1 0 0
2 1 0 1 1
3 0 0 0 1
4 1 1 0 0
你最好使用np.where
:
import numpy as np
df['3'] = np.where (df['1']==1 & df['2']==0, 1, 0)
如果第 1 列等於 1 且第 2 列等於 0,則將值 1 放入第 3 列。
df.loc[(df["1"] == 1)&(df["2"] == 0), "3"] = 1
如果第 1 列不等於 1 或第 2 列不等於 0,則將值 0 放入第 3 列。
df.loc[(df["1"] != 1)|(df["2"] != 0), "3"] = 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.