我正在尝试查询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'
答案 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