Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 2.7 比较多组列以生成布尔结果列_Python 2.7_Pandas - Fatal编程技术网

Python 2.7 比较多组列以生成布尔结果列

Python 2.7 比较多组列以生成布尔结果列,python-2.7,pandas,Python 2.7,Pandas,使用Pandas,我有一个如下所示的数据帧: 列a列b列a1列b1 拉里彼得 李杰里米伊利亚 我想将列a与列b进行比较,将列a1与列b1进行比较。如果两个对都匹配,则在新列中指明它(标志): 列a列b列a1列b1标志 拉里·彼得·特鲁尔 李李杰里米伊利亚假 如何执行此操作?您可以使用应用功能: import pandas as pd df = pd.DataFrame({'col_a':('A','B'), 'col_b':('A','B'), 'col_a1':('C','D'),'co

使用Pandas,我有一个如下所示的数据帧:

列a列b列a1列b1
拉里彼得
李杰里米伊利亚
我想将
列a
列b
进行比较,将
列a1
列b1
进行比较。如果两个对都匹配,则在新列中指明它(
标志
):

列a列b列a1列b1标志
拉里·彼得·特鲁尔
李李杰里米伊利亚假

如何执行此操作?

您可以使用应用功能:

import pandas as pd

df = pd.DataFrame({'col_a':('A','B'), 'col_b':('A','B'), 'col_a1':('C','D'),'col_b1':('C','E')})

df = df[['col_a','col_b','col_a1','col_b1']]

df['flag'] = df.apply(lambda x: ('True' if x['col_a']== x['col_b'] and x['col_a1']==x['col_b1'] else 'False'),axis=1)

print df

您可以使用
DataFrame.eval

import pandas as pd

df = pd.DataFrame({
    "col_a":["Larry","Lee"],
    "col_b":["Larry","Lee"],
    "col_a1":["Peter","Jeremy"],
    "col_b1":["Peter","Ilia"]
    })

print df
df["flag"] = df.eval("col_a==col_b and col_a1==col_b1")    
print df
输出:

   col_a  col_a1  col_b col_b1
0  Larry   Peter  Larry  Peter
1    Lee  Jeremy    Lee   Ilia

   col_a  col_a1  col_b col_b1   flag
0  Larry   Peter  Larry  Peter   True
1    Lee  Jeremy    Lee   Ilia  False
   col_a  col_a1  col_b col_b1   flag
0  Larry   Peter  Larry  Peter   True
1    Lee  Jeremy    Lee   Ilia  False
如果要比较的列恰好存储在两个列表中,如
a_cols
b_cols
,您可以执行以下操作:

a_cols = ["col_a","col_a1"]
b_cols = ["col_b","col_b1"]
df["flag"] = df.eval(" and ".join("%s==%s" % pair for pair in zip(a_cols,b_cols)))   
print df
输出:

   col_a  col_a1  col_b col_b1
0  Larry   Peter  Larry  Peter
1    Lee  Jeremy    Lee   Ilia

   col_a  col_a1  col_b col_b1   flag
0  Larry   Peter  Larry  Peter   True
1    Lee  Jeremy    Lee   Ilia  False
   col_a  col_a1  col_b col_b1   flag
0  Larry   Peter  Larry  Peter   True
1    Lee  Jeremy    Lee   Ilia  False

我发现下面的代码更易于阅读。 您只需一次比较两列,然后
两个结果即可获得
标志
列:

一行:

In [18]: tf['flag'] = (tf['col_a'] == tf['col_b']) & (tf['col_a1'] == tf['col_b1'])

In [19]: tf
Out[19]: 
   col_a  col_b  col_a1 col_b1   flag
0  Larry  Larry   Peter  Peter   True
1    Lee    Lee  Jeremy   Ilia  False

'col_a1'('C','D')
应该是
'col_a1':('C','D')
并且此方法限制了它的两列比较,OP的输入可以有多个列。感谢您的帮助。我的代码看起来很好,所以我一定是复制了它,并意外地删除了冒号。看起来col_a,col_b是df.eval的硬代码int,我们有办法成对循环列吗?我们怎么做?@LarryWoo你到底想做什么?请提供更多细节,或者问另一个问题,我会尽力帮助你;)例如,我们不知道Dataframe中的确切列数,它是动态的,我会读取by函数,columns获取所有列并存储在列表中,然后尝试成对比较数据,如何循环列表并使df.eval()工作?@LarryWoo好的,让我看看我是否理解你,您所说的是要比较的列是动态生成的?如果是这样的话,你可以构造
eval
字符串,我会在我的答案上举个例子;)@LarryWoo我已经更新了我的答案,希望它能帮助你,如果你需要帮助理解字符串操作,请不要害怕问。如果您觉得我的答案有用,请投票或标记为接受,谢谢。