两个数据帧之间的元素明智比较(其中一个包含列表)

时间:2017-09-10 00:26:09

标签: python list pandas dataframe comparison

我有两个两个Dataframe,一个由列表组成。

    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'对象是可变的,因此无法进行哈希处理。

请与我分享这个问题的正确解决方案。非常感谢!

3 个答案:

答案 0 :(得分:2)

使用setsdf.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

user3847943's solution是一个不错的选择,但可以使用set成员资格测试进行改进。

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

答案 1 :(得分:1)

您可以使用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))

答案 2 :(得分:1)

试试这个

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