我有两个两个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'对象是可变的,因此无法进行哈希处理。
请与我分享这个问题的正确解决方案。非常感谢!
答案 0 :(得分:2)
使用sets
和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
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