gpt4 book ai didi

python - 如何根据多列中的字符串匹配来选择 Pandas 数据框中的行

转载 作者:行者123 更新时间:2023-11-28 21:31:16 25 4
gpt4 key购买 nike

我认为这个确切的问题还没有得到回答,所以这里开始吧。

我有一个 Pandas 数据框,我想选择 A 列 B 列中包含字符串的所有行。

假设数据框看起来像这样:

d = {'id':["1", "2", "3", "4"], 
'title': ["Horses are good", "Cats are bad", "Frogs are nice", "Turkeys are the best"],
'description':["Horse epitome", "Cats bad but horses good", "Frog fancier", "Turkey tome, not about horses"],
'tags':["horse, cat, frog, turkey", "horse, cat, frog, turkey", "horse, cat, frog, turkey", "horse, cat, frog, turkey"],
'date':["2019-01-01", "2019-10-01", "2018-08-14", "2016-11-29"]}

dataframe = pandas.DataFrame(d)

给出:

id              title                      description               tag           date
1 "Horses are good" "Horse epitome" "horse, cat" 2019-01-01
2 "Cats are bad" "Cats bad" "horse, cat" 2019-10-01
3 "Frogs are nice" "Frog fancier, horses good" "horse, frog" 2018-08-14
4 "Turkey are best" "Turkey tome" "turkey, horse" 2016-11-29

假设我想创建一个新的数据框,其中包含在 title 列或 description 列中包含字符串 horse(忽略大写)的行>,但不在 tag 列(或任何其他列)中。

结果应该是(第 2 行和第 4 行被丢弃):

id                title                     description                 tag          date  
1 "Horses are good" "Horse epitome" "horse, cat" 2019-01-01
3 "Frogs are nice" "Frog fancier, horses good" "horse, frog" 2018-08-14

我在一个专栏中看到了一些答案,例如:

dataframe[dataframe['title'].str.contains('horse')]

但我不确定 (1) 如何向该语句添加多个列,以及 (2) 如何使用 string.lower() 之类的东西修改它以删除列值中的大写字母字符串匹配。

提前致谢!

最佳答案

如果要指定用于测试的列,一种可能的解决方案是连接所有列,然后使用 Series.str.contains 进行测试和 case=False:

s = dataframe['title'] + dataframe['description']
df = dataframe[s.str.contains('horse', case=False)]

或者为每一列创建条件,并通过 | 按位OR 将它们链接起来:

df = dataframe[dataframe['title'].str.contains('horse', case=False) | 
dataframe['description'].str.contains('horse', case=False)]

此外,如果想要指定列列用于不使用按位 AND 的测试链解决方案,并通过 ~NOT MATCH 反转条件:

df = dataframe[s.str.contains('horse', case=False) &
~dataframe['tags'].str.contains('horse', case=False)]

对于第二种解决方案,在所有列周围添加 (),并通过 OR 链接:

df = dataframe[(dataframe['title'].str.contains('horse', case=False) | 
dataframe['description'].str.contains('horse', case=False)) &
~dataframe['tags'].str.contains('horse', case=False)]]

编辑:

喜欢@WeNYoBen 评论可以加DataFrame.copy结束以防SettingWithCopyWarning喜欢:

s = dataframe['title'] + dataframe['description']
df = dataframe[s.str.contains('horse', case=False)].copy()

关于python - 如何根据多列中的字符串匹配来选择 Pandas 数据框中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58559581/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com