【问题标题】:Assigning values to new column based on multiple string conditions根据多个字符串条件为新列分配值
【发布时间】:2020-07-29 01:49:50
【问题描述】:

我有什么:

|    ID   |   Possible_Size    |   Actual_Size     |
|:------: |:------------------:|:-----------------:|  
|   1234  |         BIG        |        BIG        |
|   5678  |       MEDIUM       |        BIG        |
|   9876  |        SMALL       |       SMALL       |       
|   1092  |       MEDIUM       |       MEDIUM      |

我想创造什么:

|    ID   |   Possible_Size    |   Actual_Size     |       Big       |
|:------: |:------------------:|:-----------------:|:---------------:|  
|   1234  |         BIG        |        BIG        |  True Positive  |
|   5678  |       MEDIUM       |        BIG        |  False Negative |  
|   9876  |        BIG         |       SMALL       |  False Positive |   
|   1092  |       MEDIUM       |       MEDIUM      |                 |

我尝试过的:

    def sizes(row):
                        
        if row['Actual_Size'] in ['BIG'] and row['Possible_Size'] in ['BIG']:
            df['Big'] = 'True Positive'
        elif row['Actual_Size'] in ['BIG'] and row['Possible_Size'] in ['MEDIUM', 'SMALL']:
            df['Big'] = 'False Negative'
        elif row['Actual_Size'] in ['MEDIUM', 'SMALL'] and row['Possible_Size'] in ['BIG']:
            df['Big'] = 'False Positive'  
        else:
            df['Big'] = ''
                        
    df.apply(sizes, axis=1)

目前我得到一个空白的“大”列

【问题讨论】:

  • == 不是=
  • 是的,谢谢,我尝试了 = 和 == 。改变了这一点,我现在只得到一个空白的“大”列。
  • 您可以尝试打印row['Actual_Size'] 以查看变量中的内容。我最好的猜测是字符串中可能有尾随空格。如果有尾随空格,您可能需要在比较之前执行strip()

标签: python pandas function dataframe keyerror


【解决方案1】:

对于这多个 if/elif 语句,您可以使用 np.select:

choices = ['True Positive','False Negative','False Positive']
conditions = [
       ((df['Actual_Size'].isin(['BIG']))&(df['Possible_Size'].isin(['BIG']))), 
       ((df['Actual_Size'].isin(['BIG']))&(df['Possible_Size'].isin(['MEDIUM', 'SMALL']))),
       ((df['Actual_Size'].isin(['MEDIUM', 'SMALL']))&(df['Possible_Size'].isin(['BIG'])))]
import numpy as np
df['Big'] = np.select(conditions, choices, default='')

如果你想保留原来的解决方案,问题是你在逐行应用函数时没有返回任何东西,所以你可以试试这个:

def sizes(row):

    if row['Actual_Size'] in ['BIG'] and row['Possible_Size'] in ['BIG']:
        return'True Positive'
    elif row['Actual_Size'] in ['BIG'] and row['Possible_Size'] in ['MEDIUM', 'SMALL']:
        return 'False Negative'
    elif row['Actual_Size'] in ['MEDIUM', 'SMALL'] and row['Possible_Size'] in ['BIG']:
        return 'False Positive'  
    else:
        return ''

df['Big']=df.apply(sizes, axis=1)

两个输出:

df
     ID Possible_Size Actual_Size             Big
0  1234           BIG         BIG   True Positive
1  5678        MEDIUM         BIG  False Negative
2  9876           BIG       SMALL  False Positive
3  1092        MEDIUM      MEDIUM                

【讨论】:

  • 是的,非常感谢!只是出于兴趣,您有什么理由会使用一种解决方案而不是另一种解决方案?
  • 在这样的多个条件下,我会使用np.select,因为您可能知道 numpy 提供了更好的性能,而另一个选项(apply) 有时it's slower
猜你喜欢
  • 2018-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-23
  • 1970-01-01
  • 2018-05-28
  • 2020-04-09
相关资源
最近更新 更多