返回pandas数据框中的行,其中列中的元组包含特定值

时间:2015-04-05 22:45:51

标签: python pandas tuples dataframe

我正在尝试查询pandas数据帧,其中一列包含一个包含特定值的元组。

举个例子:

   User                 Col1
0     1     (cat, dog, goat)
1     1         (cat, sheep)
2     1        (sheep, goat)
3     2          (cat, lion)
4     2  (fish, goat, lemur)
5     3           (cat, dog)
6     4          (dog, goat)
7     4                  cat

假设我想返回Col1包含'cat'的行,有没有办法在不迭代每行并执行“if”(我的实际数据集有更多行)的情况下执行此操作?

df['Col1'].isin(['cat'])

df['Col1'].str.contains("cat")

仅为最后一行返回'true'

3 个答案:

答案 0 :(得分:1)

为什么不对数据框进行子集化然后输出结果?

catdf = df[df['Col1'].str.contains("cat")]

答案 1 :(得分:1)

您可以在apply()中使用lambda函数:

df[df["Col1"].apply(lambda x: True if "cat" in x else False)]

True在单元格中时,lambda返回"cat"。这适用于两个字符串("cat" in "cat"True)和元组("cat" in ("cat", "dog")True)。通过对df进行子集化,可以获得lambda为True的所有行。

答案 2 :(得分:0)

您的DataFrame列包含字符串和元组的混合。我不认为你可以避免重复列。但是您可以使用apply方法有效地迭代。示例代码如下。

import pandas as pd

# fake data - in a Series for simplicity
tlist = [('cat', 'dog', 'goat'),
    ('cat', 'sheep'),
    ('sheep', 'goat'),
    ('cat', 'lion'),
    ('fish', 'goat', 'lemur'),
    ('cat', 'dog'),
    ('dog', 'goat'),
    'cat']
s = pd.Series(tlist)

# iterate Series with a lambda function searching for 'cat'
s.apply(lambda x: 'cat' in x)

这给了我以下输出

Out[38]: 
0     True
1     True
2    False
3     True
4    False
5     True
6    False
7     True
dtype: bool