【问题标题】:Creating a new column depending on the equality of two other columns根据其他两列的相等性创建新列
【发布时间】:2017-05-19 10:22:01
【问题描述】:

我想比较我创建新列bin_crnn 的两列的值。如果它们相等,我想要 1,如果不相等,我想要 0。

# coding: utf-8
import pandas as pd

df = pd.read_csv('file.csv',sep=',')

if df['crnn_pred']==df['manual_raw_value']:
    df['bin_crnn']=1
else:
    df['bin_crnn']=0

我收到以下错误

    if df['crnn_pred']==df['manual_raw_value']:
  File "/home/ahmed/anaconda3/envs/cv/lib/python2.7/site-packages/pandas/core/generic.py", line 917, in __nonzero__
    .format(self.__class__.__name__))
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您需要将布尔掩码转换为 intastype

    df['bin_crnn'] = (df['crnn_pred']==df['manual_raw_value']).astype(int)
    

    示例:

    df = pd.DataFrame({'crnn_pred':[1,2,5], 'manual_raw_value':[1,8,5]})
    print (df)
       crnn_pred  manual_raw_value
    0          1                 1
    1          2                 8
    2          5                 5
    
    print (df['crnn_pred']==df['manual_raw_value'])
    0     True
    1    False
    2     True
    dtype: bool
    
    df['bin_crnn'] = (df['crnn_pred']==df['manual_raw_value']).astype(int)
    print (df)
       crnn_pred  manual_raw_value  bin_crnn
    0          1                 1         1
    1          2                 8         0
    2          5                 5         1
    

    您会收到错误,因为如果比较列输出不是标量,而是TrueFalse 值的Series (array)。

    所以需要allany 用于返回标量 TrueFalse

    我认为最好解释一下this answer

    【讨论】:

      【解决方案2】:

      一种快速的方法是使用 np.where。

      import numpy as np
      df['test'] = np.where(df['crnn_pred']==df['manual_raw_value'], 1, 0)
      

      【讨论】:

      • 不错的方法@Allen。关于该方法及其与列表理解的好处(取决于数据集大小)的良好问答:stackoverflow.com/q/19913659/6163621
      • 我认为在此之前必须提出并回答过类似的问题。我会看看那个线程。 @pshep123
      【解决方案3】:

      不需要循环或 if 语句,只需要使用布尔掩码设置一个新列。

      df['bin_crnn'].loc[df['crnn_pred']==df['manual_raw_value']] = 1
      df['bin_crnn'].fillna(0, inplace = True) 
      

      【讨论】:

        【解决方案4】:

        另一种只使用 Pandas 而不是 Numpy 的快速方法是

        df['columns_are_equal'] = df.apply(lambda x: int(x['column_a'] ==x['column_b']), axis=1)
        

        【讨论】:

          【解决方案5】:

          您正在比较 2 列,试试这个..

          bin_crnn = []
          for index, row in df.iterrows():
              if row['crnn_pred'] == row['manual_raw_value']:
                  bin_crnn.append(1)
              else:
                  bin_crnn.append(0)
          df['bin_crnn'] = bin_crnn
          

          【讨论】:

            猜你喜欢
            • 2021-08-30
            • 2022-07-05
            • 1970-01-01
            • 2023-03-17
            • 2017-01-03
            • 1970-01-01
            • 1970-01-01
            • 2020-06-02
            相关资源
            最近更新 更多