Python 两个数据帧(其中一个包含列表)之间的元素级比较
我有两个数据帧,其中一个由列表组成Python 两个数据帧(其中一个包含列表)之间的元素级比较,python,list,pandas,dataframe,comparison,Python,List,Pandas,Dataframe,Comparison,我有两个数据帧,其中一个由列表组成 in [00]: table01 out[00]: a b 0 1 2 1 2 3 in [01]: table02 out[01]: a b 0 [2] [3] 1 [1,2] [1,2] 现在我想比较两张表。如果table01中的元素也在table02的相同位置列表中,则返回True,否则返回False。所以我想要的表格是:
in [00]: table01
out[00]:
a b
0 1 2
1 2 3
in [01]: table02
out[01]:
a b
0 [2] [3]
1 [1,2] [1,2]
现在我想比较两张表。如果table01中的元素也在table02的相同位置列表中,则返回True,否则返回False。所以我想要的表格是:
a b
0 False False
1 True False
我尝试了table02中的table01,但得到一条错误消息:“DataFrame”对象是可变的,因此不能对它们进行散列
请与我分享这个问题的正确解决方案。非常感谢 使用
设置和df.applymap
:
df3 = df1.applymap(lambda x: {x})
df4 = df2.applymap(set)
df3 & df4
a b
0 {} {}
1 {2} {}
(df3 & df4).astype(bool)
a b
0 False False
1 True False
是一个很好的选择,但是可以通过set
membership测试进行改进
def find_in_array(a, b):
return a in b
for c in df2.columns:
df2[c] = df2[c].map(set)
vfunc = np.vectorize(find_in_array)
df = pd.DataFrame(vfunc(df1, df2), index=df1.index, columns=df1.columns)
df
a b
0 False False
1 True False
使用设置
和df.applymap
:
df3 = df1.applymap(lambda x: {x})
df4 = df2.applymap(set)
df3 & df4
a b
0 {} {}
1 {2} {}
(df3 & df4).astype(bool)
a b
0 False False
1 True False
是一个很好的选择,但是可以通过set
membership测试进行改进
def find_in_array(a, b):
return a in b
for c in df2.columns:
df2[c] = df2[c].map(set)
vfunc = np.vectorize(find_in_array)
df = pd.DataFrame(vfunc(df1, df2), index=df1.index, columns=df1.columns)
df
a b
0 False False
1 True False
您可以通过使用numpy.vectorize轻松完成此操作。示例代码如下
import numpy as np
import pandas as pd
t1 = pd.DataFrame([[1, 2],[2,3]])
t2 = pd.DataFrame([[[2],[3]],[[1,2],[1,2]]])
def find_in_array(a, b):
return a in b
vfunc = np.vectorize(find_in_array)
print(vfunc(t1, t2))
您可以通过使用numpy.vectorize轻松完成此操作。示例代码如下
import numpy as np
import pandas as pd
t1 = pd.DataFrame([[1, 2],[2,3]])
t2 = pd.DataFrame([[[2],[3]],[[1,2],[1,2]]])
def find_in_array(a, b):
return a in b
vfunc = np.vectorize(find_in_array)
print(vfunc(t1, t2))
试试这个
df=pd.melt(df1.reset_index(),'index')
df['v2']=pd.melt(df2.reset_index(),'index').value
pd.melt(df2.reset_index(),'index')
df['BOOL']=df.apply(lambda x: True if x.value in x.v2 else False, axis = 1)
df.pivot('index','variable','BOOL')
Out[491]:
variable a b
index
0 False False
1 True False
最后:
df1.apply(lambda x: [(x==df2.loc[y,x.name])[y] for y in x.index])
Out[668]:
a b
0 False False
1 True False
试试这个
df=pd.melt(df1.reset_index(),'index')
df['v2']=pd.melt(df2.reset_index(),'index').value
pd.melt(df2.reset_index(),'index')
df['BOOL']=df.apply(lambda x: True if x.value in x.v2 else False, axis = 1)
df.pivot('index','variable','BOOL')
Out[491]:
variable a b
index
0 False False
1 True False
最后:
df1.apply(lambda x: [(x==df2.loc[y,x.name])[y] for y in x.index])
Out[668]:
a b
0 False False
1 True False
table02中的table01
并不是什么尝试……好吧,对于纯值比较来说。table01==table02可以工作,但我不明白为什么它在我的情况下不工作。事实上,我发现如果我一个接一个地打电话给手机,用“in”,然后把结果放回去,就行了。然而,我目前的解决方案非常耗时,这就是我提出这个问题的原因。很抱歉,我的陈述不清楚。因为==
运算符重载,无法处理数据帧。将进行元素级比较,因为int!=罗列,一切都是假的<对于数据帧来说,
中的code>不是这样工作的。table02中的table01
并不是什么尝试……对于纯值比较来说。table01==table02可以工作,但我不明白为什么它在我的情况下不工作。事实上,我发现如果我一个接一个地打电话给手机,用“in”,然后把结果放回去,就行了。然而,我目前的解决方案非常耗时,这就是我提出这个问题的原因。很抱歉,我的陈述不清楚。因为==
运算符重载,无法处理数据帧。将进行元素级比较,因为int!=罗列,一切都是假的<中的code>对数据帧不起作用。您好,如果您有时间,我有一个问题…df1.apply(lambda x:x.values in df2.loc[x.index,x.name].values)
,为什么不起作用…@Wendf2.loc[…]
返回一个列表项,而列表项没有.values。这是第一个问题。第二个是x.values
是一个列表,在python中,你不能在列表2中真正执行list1,它不起作用。谢谢,似乎不起作用..当我执行df1.apply时(lambda x:df2.loc[x.index,x.name])
它返回df2,这让我认为可以用这种方法解决问题problem@Wen嗯<代码>df.apply
行为怪异。。。基于此,我打开了一个新问题:嗨,我知道了,通过使用idea x.index和x.name,更新了~:)嗨,如果你有时间,我知道了一个问题…df1.apply(lambda x:x.values in df2.loc[x.index,x.name].values)
,为什么这不起作用…@Wendf2.loc[…]
返回一个列表项,并且列表项没有.value。这是第一个问题。第二个是x.values
是一个列表,在python中,你不能在列表2中真正执行list1,它不起作用。谢谢,似乎不起作用..当我执行df1.apply时(lambda x:df2.loc[x.index,x.name])
它返回df2,这让我认为可以用这种方法解决问题problem@Wen嗯<代码>df.apply
行为怪异。。。基于此,我提出了一个新问题:嗨,我知道了,使用idea x.index和x.name,并更新了~:)