根据两个其他列是否相等创建新列

8

我想比较两列的值,然后创建一个名为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个回答

10
您需要使用astype将布尔掩码转换为整数类型:
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

我认为这篇答案解释得更好。


10

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

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

@Allen 的方法很好。这里有一个关于该方法的良好问答,讨论了它与列表推导式在数据集大小方面的优劣:https://dev59.com/os-90IgBFxS5KdRjteUd - elPastor
我认为类似的问题在这里之前肯定已经被问过并得到了回答。我会去看一下那个帖子。@pshep123 - Allen Qin

0
另一个使用 Pandas 而不是 Numpy 的快速方法是:
df['columns_are_equal'] = df.apply(lambda x: int(x['column_a'] ==x['column_b']), axis=1)

0

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

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

-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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接