假设这个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],[]]})
答案 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] []