Python 熊猫:比较序列中的列表对象
在我的数据框架中,列由列表组成,例如:Python 熊猫:比较序列中的列表对象,python,pandas,Python,Pandas,在我的数据框架中,列由列表组成,例如: df = pd.DataFrame({'A':[[1,2],[2,4],[3,1]]}) 我需要找出列表[1,2]在这个数据帧中的位置。我试过: df.loc[df['A'] == [1,2]] 及 但完全失败了。比较起来似乎很简单,但这根本不起作用。我在这里遗漏了什么吗?不要在单元格中使用列表,这会给熊猫带来很多问题。如果确实需要对象列,请使用元组: df.A.map(tuple).isin([(1,2)]) Out[293]: 0 Tru
df = pd.DataFrame({'A':[[1,2],[2,4],[3,1]]})
我需要找出列表[1,2]在这个数据帧中的位置。我试过:
df.loc[df['A'] == [1,2]]
及
但完全失败了。比较起来似乎很简单,但这根本不起作用。我在这里遗漏了什么吗?不要在单元格中使用
列表
,这会给熊猫
带来很多问题。如果确实需要对象
列,请使用元组
:
df.A.map(tuple).isin([(1,2)])
Out[293]:
0 True
1 False
2 False
Name: A, dtype: bool
#df[df.A.map(tuple).isin([(1,2)])]
您可以使用
apply
并进行如下比较:
df['A'].apply(lambda x: x==[1,2])
0 True
1 False
2 False
Name: A, dtype: bool
使用numpy
df.A.apply(lambda x: (np.array(x) == np.array([1,2])).all())
0 True
1 False
2 False
使用Numpy数组
或:
然后:
这应该是公认的解决方案![或者,如果可能,只是将列表系列扩展为2个系列。]如果列表大小不同,这不会出现问题,尽管这可能超出了本示例的范围。@ALollz yes and yesNice!我唯一关心的是,这个解决方案将数据类型转换两次,如果我的数据帧非常大,那么转换会花费更多的时间吗?您唯一“缺少”的是,数据帧对于存储列表来说并不是很好。你为什么不想要两个单独的专栏?@BallpointBen谢谢你的关注,我发布了一个新问题来解释整个问题@Luuklag这可能是重复的,但我不相信这是你建议的目标的重复。这似乎是试图根据多列是否等于特定值进行筛选。这一个试图检查列表是否等于一个列的值,该值的答案非常不同。请随意建议一个更合适的目标。@Luuklag,我发布了这两个问题,因为我认为它们不一样。正如jpmc所描述的,它们是相互联系的,但也非常不同。这篇文章实际上是那篇文章的变体:我试图用愚蠢的事情来解决那篇文章,并基于我发表的这篇文章的愚蠢的事情。但这一点仍然有其独特的价值。你能删除重复的目标吗?
print(df[df['A'].apply(lambda x: x==[1,2])])
A
0 [1, 2]
df.A.apply(lambda x: (np.array(x) == np.array([1,2])).all())
0 True
1 False
2 False
df.assign(B=(np.array(df.A.tolist()) == [1, 2]).all(1))
A B
0 [1, 2] True
1 [2, 4] False
2 [3, 1] False
df['A'].apply(([1,2]).__eq__)
df[df['A'].apply(([1,2]).__eq__)]