Python 数据帧中跨多个列的映射方法

Python 数据帧中跨多个列的映射方法,python,list,pandas,dataframe,Python,List,Pandas,Dataframe,我有一个数据框,其中的值是列表: import pandas as pd DF = pd.DataFrame({'X':[[1, 5], [1, 2]], 'Y':[[1, 2, 5], [1, 3, 5]]}) DF X Y 0 [1, 5] [1, 2, 5] 1 [1, 2] [1, 3, 5] 我想检查X中的列表是否是Y中列表的子集。对于单个列表,我们可以使用setx.issubsetsety来执行此操作。但是,我们如何跨数据列实现这一

我有一个数据框,其中的值是列表:

import pandas as pd

DF = pd.DataFrame({'X':[[1, 5], [1, 2]], 'Y':[[1, 2, 5], [1, 3, 5]]})
DF
         X          Y
0   [1, 5]  [1, 2, 5]
1   [1, 2]  [1, 3, 5]
我想检查X中的列表是否是Y中列表的子集。对于单个列表,我们可以使用setx.issubsetsety来执行此操作。但是,我们如何跨数据列实现这一点呢

到目前为止,我唯一想到的是使用单个列表作为解决方法,然后将结果转换回Pandas。这项任务似乎有点复杂:

foo = [set(DF['X'][i]).issubset(set(DF['Y'][i])) for i in range(len(DF['X']))]

foo = pd.DataFrame(foo)
foo.columns = ['x_sub_y']
pd.merge(DF, foo, how = 'inner', left_index = True, right_index = True)

         X          Y   x_sub_y
0   [1, 5]  [1, 2, 5]   True
1   [1, 2]  [1, 3, 5]   False
有没有更简单的方法来实现这一点?可能使用.map或.apply?

选项1 使用np.where设置转换和差异

选择2 更快、更简单的类型转换

DF['x_sub_y'] = ~(DF.X.apply(set) - DF.Y.apply(set)).astype(bool)
DF 
        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
选择3 np.vectorize的乐趣

使用相同的方法扩展速度:

def foo(x, y):
    return set(x).issubset(y)

v = np.vectorize(foo)

DF['x_sub_y'] = v(DF.X, DF.Y)
DF
        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
小的 大型df*10000 选择1 使用np.where设置转换和差异

选择2 更快、更简单的类型转换

DF['x_sub_y'] = ~(DF.X.apply(set) - DF.Y.apply(set)).astype(bool)
DF 
        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
选择3 np.vectorize的乐趣

使用相同的方法扩展速度:

def foo(x, y):
    return set(x).issubset(y)

v = np.vectorize(foo)

DF['x_sub_y'] = v(DF.X, DF.Y)
DF
        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
小的 大型df*10000 使用set和issubset:

输出:

        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
使用set和issubset:

输出:

        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
或者你也可以试试set

或者你也可以试试set


如果我矢量化你的答案,我在这个小数据集上得到a。顺便说一句,你不需要将x.Y转换成一个集合。如果我矢量化你的答案,我在这个小数据集上得到a。顺便说一句,你不需要将x.Y转换成一个集合。如果你使用的是Scott Boston的答案,我建议你也使用np.vectorise:OP,如果你使用的是Scott Boston的答案,我也建议使用np.vectorise:对两行DF进行计时有意义吗?@MaxU如果两行之间的差异如此巨大,那么可能就没有必要对更大的一行进行计时。。。但我可以做到:一个更大的数据集的时间可能不一定会显示出完全不同的结果…@MaxU谢谢你的提问。。。现在更加欣赏np.vectorise:-为什么我以前没有用过它?xD对两行DF进行计时有意义吗?@MaxU如果两行之间的差异如此巨大,那么可能没有必要对更大的一行进行计时。。。但我可以做到:一个更大的数据集的时间可能不一定会显示出完全不同的结果…@MaxU谢谢你的提问。。。现在更加欣赏np.vectorise:-为什么我以前没有用过它?x
DF.assign(x_sub_y = DF.apply(lambda x: set(x.X).issubset(set(x.Y)), axis=1))
        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False
DF['x_sub_y']=DF.X+DF.Y
DF['x_sub_y']=DF['x_sub_y'].apply(lambda x : list(set(x)))==DF.Y
DF
Out[691]: 
        X          Y  x_sub_y
0  [1, 5]  [1, 2, 5]     True
1  [1, 2]  [1, 3, 5]    False