熊猫数据框列中的成员资格测试
Posted
技术标签:
【中文标题】熊猫数据框列中的成员资格测试【英文标题】:membership test in pandas data frame column 【发布时间】:2017-07-05 05:53:28 【问题描述】:我有一个熊猫数据框,其中一列是列表。请看下面:
>>> a.head
C1 C2
0 23 [2,4,5,8,1]
1 24 [1,2]
2 15 [-2]
3 19 [1,3,4,5,6,7,8,9,0]
我想在 C2 中找到包含 6 的行并返回 C1 中的值。我想像
b = a["C1"][(6 in a["C2"])]
return(int(b))
但它不起作用。 谢谢。
【问题讨论】:
【参考方案1】:对于内置 Pandas 方法,请尝试isin
。
Pandas 列,Series
对象,有一个名为 isin
的 method 用于此类事情。它返回一个位置boolean Series
(掩码)。它会在您的列中找到给定列表中的值。
s = pd.Series(['lama', 'cow', 'lama', 'beetle', 'lama',
'hippo'], name='animal')
s.isin(['cow', 'lama'])
0 True
1 True
2 True
3 False
4 True
5 False
【讨论】:
这与 OP 的要求相反。这不是如何在给定列表中测试列的成员资格;这是如何测试值的成员资格在列表列中。【参考方案2】:我认为您需要apply
和in
来测试list
中的值以创建boolean mask
:
print (a.C2.apply(lambda x: 6 in x))
0 False
1 False
2 False
3 True
Name: C2, dtype: bool
然后使用loc
和boolean indexing
供mask
选择:
b = a.loc[a.C2.apply(lambda x: 6 in x), 'C1']
print (b)
3 19
Name: C1, dtype: int64
如果需要,最后一个标量输出转换为numpy array
并通过[]
选择第一个值:
print (b.values)
[19]
print (b.values[0])
19
或者使用iat
或iloc
:
print (b.iat[0])
19
print (b.iloc[0])
19
【讨论】:
FWIW,apply 通常比执行相同操作的内置方法方式慢。 @ringo - 我同意,但这里的测试列C2
填充了列表,所以 isin
失败,因为 isin
工作于由标量填充的测试列,例如 C1
。跨度>
以上是关于熊猫数据框列中的成员资格测试的主要内容,如果未能解决你的问题,请参考以下文章