Python 2.7 比较多组列以生成布尔结果列
使用Pandas,我有一个如下所示的数据帧: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
列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我已经更新了我的答案,希望它能帮助你,如果你需要帮助理解字符串操作,请不要害怕问。如果您觉得我的答案有用,请投票或标记为接受,谢谢。