【问题标题】:Add column based on multiple conditions根据多个条件添加列
【发布时间】:2019-07-21 05:19:30
【问题描述】:

我有一个愚蠢的问题。我的df 看起来像这样:

       FID_2     STA_SID           s2            s1  Qh_STA  Qh_FID2  \
14 222143.00 26040713.00           0.00        0.00    8.00    17.00   
15 222143.00 26040713.00           0.00        8.00    6.00    17.00   
13 222143.00 26040713.00           6.00        8.00    3.00    17.00   
17       NaN 26033594.00 29445425.00        1707.00    5.00      nan   

我定义了以下函数和命令:

A = 0.8

def seekDO(row):
       if (row['Qh_STA'])/row['Qh_FID2'] < A :
          return 1
       if ((row['Qh_STA'] + row['s1'])/row['Qh_FID2'] < A) :
          return 1
       if ((row['Qh_STA'] + row['s1'] + row['s2']) / row['Qh_FID2'] < A) :
          return 1
       return 0

df['DO'] = df.apply (lambda row: seekDO(row),axis=1)

问题是 DO 我明白了

    DO   
14  1  
15  1  
13  1  
17  0 

而不是

    DO   
14  1  
15  0  
13  0  
17  0 

你能看出我哪里弄错了吗?

【问题讨论】:

  • 与错误无关但df.apply (lambda row: seekDO(row),axis=1)df.apply (seekDO,axis=1)相同
  • 如果测试第一个条件得到值&lt;Aprint ((row['Qh_STA'])/row['Qh_FID2']) - 0.47058823529411764, 0.35294117647058826, 0.17647058823529413
  • 您的所有案例都属于第一个if声明

标签: python pandas if-statement conditional


【解决方案1】:

也许 np.where;

condition = ((df['Qh_STA'])/df['Qh_FID2'] < A) | (((df['Qh_STA'] + (df['s1'])/df['Qh_FID2']) < A)) | (((df['Qh_STA'] + df['s1'] + (df['s2']) / df['Qh_FID2']) < A))

df['DO'] = np.where(condition, 1, 0)

【讨论】:

    【解决方案2】:

    但你应该得到

        DO   
        14  1  
        15  1  
        13  1  
        17  0
    

    确实。

    再看看你的价值观。

        8 / 17 IS < 0.8
        6 / 17 IS < 0.8
        3 / 17 IS < 0.8
    

    输出是正确的,你期望得到的输出不是。

    【讨论】:

    • 第二行有条件8+6,第三行有条件8+6+3
    • 但是你返回值 BEFORE 甚至达到那个条件。你甚至没有在你的代码中达到那个条件。添加一些 print() 来查看发生了什么。
    【解决方案3】:

    我相信您可以使用所有列而不是循环来测试每个条件,这很慢:

    A = 0.8
    
    m1 = df['Qh_STA']/df['Qh_FID2'] < A 
    m2 = (df['Qh_STA'] + df['s1'])/df['Qh_FID2'] < A
    m3 = (df['Qh_STA'] + df['s1'] + df['s2']) / df['Qh_FID2'] < A
    

    如果所有条件都为True,则需要AND by &amp; 的链列进行匹配:

    df['DO'] = (m1 & m2 & m3).astype(int)
    print (df)
           FID_2     STA_SID          s2      s1  Qh_STA  Qh_FID2  DO
    14  222143.0  26040713.0         0.0     0.0     8.0     17.0   1
    15  222143.0  26040713.0         0.0     8.0     6.0     17.0   0
    13  222143.0  26040713.0         6.0     8.0     3.0     17.0   0
    17       NaN  26033594.0  29445425.0  1707.0     5.0      NaN   0
    

    【讨论】:

    • 我很抱歉。您能否在开始时重复编辑的df?这解释了为什么我的预期输出是 1 0 0
    • 但是你的答案是正确的。 DO 列是我期望得到的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2022-11-25
    • 2016-02-03
    • 1970-01-01
    • 2023-01-04
    • 2019-08-29
    相关资源
    最近更新 更多