在包含列表或字符串的熊猫中将列表作为新列获取操作

时间:2021-03-04 16:50:34

标签: python pandas list

假设这个df

df = pd.DataFrame({'a':['texttext',[1,2,3,4,5],[2,3,4,5]],
                   'b':['texttext',[1,2,5,8,9,10],[2,3,5]]})

我想获得三个额外的列: a) 列表拦截的通用值 b) 不在 b 列中的 a 列的值列表 c) c 列中的值而不是 a 列中的值

请注意,df 可能包含(如第 1 行)其他非列表值。 这让事情变得复杂

我现在如何对列表进行操作:

common = [x for x in lst1 if x in lst2]
minus = [x for x in lst1 if x not in lst2]
plus = [x for x in lst2 if x not in lst1]

但我不知道如何在熊猫中实现它。 即使对于方法(对于 .apply),我也必须发送两个值 在一个班轮中,我必须检查类型。

有什么想法吗?

非常感谢

编辑: 预期输出:

expected = pd.DataFrame({'a':['texttext',[1,2,3,4,5],[2,3,4,5]],
                     'b':['texttext',[1,2,5,8,9,10],[2,3,5]],
                    'common':['',[2,5],[2,3,5]],
                    'minus':['',[3,4,5],[4]],
                    'plus':['',[ 8, 9, 10],[]]})

[1]: https://i.stack.imgur.com/p3L1g.png

2 个答案:

答案 0 :(得分:0)

有关使用两列作为应用函数输入的内容,您可以查看 this question。 要检查您的对象是否是列表,请使用内置

isinstance(your_variable,list)

这应该是解决您问题的正确构建块。

答案 1 :(得分:0)

让我们定义一个函数来测试列 a 中的列表与列 b 中的相应列表的成员资格:

def test_membership():
    for a, b in zip(df['a'], df['b']):
        if isinstance(a, list) and isinstance(b, list):
            a, b = set(a), set(b)
            yield list(a & b), list(a - b), list(b - a)
        else:
            yield '', '', ''

df[['common', 'minus', 'plus']] = list(test_membership())

                 a                    b     common   minus        plus
0         texttext             texttext                               
1  [1, 2, 3, 4, 5]  [1, 2, 5, 8, 9, 10]  [1, 2, 5]  [3, 4]  [8, 9, 10]
2     [2, 3, 4, 5]            [2, 3, 5]  [2, 3, 5]     [4]          []
相关问题