根据其他两列的相等性创建新列

时间:2017-05-19 10:22:02

标签: python pandas dataframe

我想比较我创建新列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().

5 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

您需要使用astype

将强制转换布尔值转换为int
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

您收到错误,因为如果比较列输出不是标量,而是SeriesarrayTrueFalse值。

所以需要allany代表返回标量TrueFalse

我认为更好地解释this answer

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

使用熊猫而不是Numpy的另一种快速方法是

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

答案 4 :(得分:-1)

您正在比较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