簡體   English   中英

使用 if 條件 pandas dataframe 更新單元格值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM