登录

在python pandas中搜索整行Dataframe的多个字符串值

内容来源于 Stack Overflow,遵循 CC BY-SA 4.0 许可协议进行翻译与使用。IT领域专用引擎提供翻译支持

腾讯云小微IT领域专用引擎提供翻译支持

原文
Stack Overflow用户 修改于2018-06-14
  • 该问题已被编辑
  • 提问者: Stack Overflow用户
  • 提问时间: 2018-06-14 04:44

在pandas数据帧中,我想逐行搜索多个字符串值。如果行包含字符串值,则该函数将添加/打印该行,并将其打印到df 1或0末尾的空列中。

已经有多个教程介绍了如何选择与(部分)字符串匹配的Pandas DataFrame行。

例如:

import pandas as pd
#create sample data
data = {'model': ['Lisa', 'Lisa 2', 'Macintosh 128K', 'Macintosh 512K'],
        'launched': [1983,1984,1984,1984],
        'discontinued': [1986, 1985, 1984, 1986]}
df = pd.DataFrame(data, columns = ['model', 'launched', 'discontinued'])
df

我从这个网站上摘录了上面的例子: https://davidhamann.de/2017/06/26/pandas-select-elements-by-string/

如何对整行进行多值搜索:'int','tos','198'?

然后打印到列中,然后停止,列int将根据行是否包含该关键字而具有1或0。

浏览 300 关注 0 得票数 2
  • 得票数为Stack Overflow原文数据
原文
修改于2018-06-14
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2018-06-14 04:53
得票数 4

如果你有

l=['int', 'tos', '198']

然后,您可以通过连接 '|' 来使用 str.contains ,以获得包含这些单词的每个模型

df.model.str.contains('|'.join(l))
0    False
1    False
2     True
3     True

编辑

如果目的是检查所有列都是@jpp解释的,我建议:

from functools import reduce
res = reduce(lambda a,b: a | b, [df[col].astype(str).str.contains(m) for col in df.columns])
0    False
1     True
2     True
3     True

如果您希望它作为包含整数值的列,只需执行以下操作

df['new_col'] = res.astype(int)
     new_col
0    0
1    1
2    1
3    1
修改于2018-06-14
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2018-06-14 05:01
得票数 0

您需要检查 model 是否为 match 的子字符串。

match = [ 'int', 'tos', '198']
df['isContained'] = df['model'].apply(lambda x: 1 if any(s in x for s in match) else 0)

输出:

            model  launched  discontinued  isContained
0            Lisa      1983          1986            0
1          Lisa 2      1984          1985            0
2  Macintosh 128K      1984          1984            1
3  Macintosh 512K      1984          1986            1
修改于2018-06-15
  • 该回答已被编辑
  • 回答者: Stack Overflow用户
  • 回答时间: 2018-06-14 06:56
得票数 2

如果我理解正确的话,您希望检查每行中所有列中是否存在字符串。这并不简单,因为你有混合类型(整型,字符串)。一种方法是将 pd.DataFrame.apply 与自定义函数一起使用。

我们需要记住的要点是将整个数据帧转换为 str 类型,因为您不能测试子字符串在整数中的存在。

match = ['int', 'tos', '1985']
def string_finder(row, words):
    if any(word in field for field in row for word in words):
        return True
    return False
df['isContained'] = df.astype(str).apply(string_finder, words=match, axis=1)
print(df)
            model  launched  discontinued  isContained
0            Lisa      1983          1986        False
1          Lisa 2      1984          1985         True
2  Macintosh 128K      1984          1984         True
3  Macintosh 512K      1984          1986         True
Stack Overflow用户
已采纳
回答于2018-06-27
得票数 0

因此,不使用花哨的pandas工具的最简单的方法是使用两个for循环。我希望有人能给出一个更好的解决方案,但我的方法是:

def check_all_for(column_name, search_terms):
    df[column_name] = ''
    for row in df.iterrows():
        flag = 0
        for element in row:
            for search_term in search_terms:
                if search_term in (str(element)).lower():
                    flag = 1
        row[column_name] = flag

假设您已经将 dataframe 定义为 df ,并且希望用1和0标记新列

回答于2019-04-01
得票数 0

@Guy_Fuqua,我的理解是你想确保所有的单词都包含在一行中,对吗?

如果是这样,那么对jpp answer进行一点修改就可以帮助您实现这一点,请注意这里的AssessAllString函数

match = ['int', 'tos', '1984']
def string_finder(row, words):
    if any(word in field for field in row for word in words):
        return True
    return False
def AssessAllString (row,words):
    b=True
    for x in words:
      b = b&string_finder(row,[x])
    return b
df['isContained'] = df.astype(str).apply(AssessAllString, words=match, axis=1)
print(df)
            model  launched  discontinued  isContained
0  Lisa            1983      1986          False      
1  Lisa 2          1984      1985          False      
2  Macintosh 128K  1984      1984          True       
3  Macintosh 512K  1984      1986          True 

另一个示例:

match = ['isa','1984']
df['isContained'] = df.astype(str).apply(AssessAllString, words=match, axis=1)