熊猫数据框列中的成员资格测试

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】:

我认为您需要applyin 来测试list 中的值以创建boolean mask

print (a.C2.apply(lambda x: 6 in x))
0    False
1    False
2    False
3     True
Name: C2, dtype: bool

然后使用locboolean indexingmask 选择:

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

或者使用iatiloc

print (b.iat[0])
19

print (b.iloc[0])
19

【讨论】:

FWIW,apply 通常比执行相同操作的内置方法方式慢。 @ringo - 我同意,但这里的测试列 C2 填充了列表,所以 isin 失败,因为 isin 工作于由标量填充的测试列,例如 C1。跨度>

以上是关于熊猫数据框列中的成员资格测试的主要内容,如果未能解决你的问题,请参考以下文章

用另一个值替换熊猫数据框列中的几个值

比较熊猫数据框列中的值时出现类型错误

过滤熊猫数据框列中的字符串/浮点数/整数值

从列表列表中提取元素并将其分配为熊猫数据框列中的值

为啥在一种情况下更改熊猫数据框列中的值很快,而在另一种情况下更改速度很慢?

在熊猫数据框列中查找特定文本