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)
,为什么不起作用…@Wen
df2.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)
,为什么这不起作用…@Wen
df2.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,并更新了~:)