Python 标记";“真的”;在一次迭代中包含关键字(关键字为列名)的行

Python 标记";“真的”;在一次迭代中包含关键字(关键字为列名)的行,python,pandas,dataframe,Python,Pandas,Dataframe,我想对pandas dataframe进行关键字搜索,将每个关键字作为一列添加到数据集中,并标记包含该关键字的数据行的“True” 一段代码很好地实现了这一点: stocks=['Microsoft'、'Apple'、'Amazon'] 对于库存: df[stock]=df.astype(str).sum(axis=1).str.contains(stock) 但是,对于每个关键字,这会在整个数据集中循环一次。我想在一次迭代中做同样的事情(即每行只检查一次关键字的存在),因为我的数据集很大 预

我想对pandas dataframe进行关键字搜索,将每个关键字作为一列添加到数据集中,并标记包含该关键字的数据行的“True”

一段代码很好地实现了这一点:

stocks=['Microsoft'、'Apple'、'Amazon']
对于库存:
df[stock]=df.astype(str).sum(axis=1).str.contains(stock)
但是,对于每个关键字,这会在整个数据集中循环一次。我想在一次迭代中做同样的事情(即每行只检查一次关键字的存在),因为我的数据集很大

预期结果如下:

任何帮助都将不胜感激


编辑:我得到一个内存错误

我无法想象有什么东西不经过三个键就可以做你想要的事情

不过,我有两个建议:

  • 只做一次:这可能是一个很长的操作,但是你把它转储到一个文件中,下次你需要它时,它已经存在了:加载文件,你就可以开始了
  • 您可以使用csv之类的简单工具:

    my_df.to_csv("my_file.csv")
    
    或者,如果您想更快,请使用该格式

  • 将“文本”列定义为循环外的字符串类型。从图中我看到,你不需要求和(轴=1),但如果你真的需要,也可以在循环之外进行:创建一个系列,然后在其上循环
  • 例如:

    text_series = df[stock].astype(str).sum(axis=1)
    for stock in stocks:
       df[stock] = text_series.str.contains(stock)
    
    batch_size = df.shape[0]/10 # e.g. divide your df in 10 chunks
    for i in range(0,df.shape[0],batch_size): #batch_size is the step
       for stock in stocks:
          df[i:i+batch_size][stock] = text_series[i:i+batch_size].str.contains(stock)
    
  • 分批计算操作
  • 例如:

    text_series = df[stock].astype(str).sum(axis=1)
    for stock in stocks:
       df[stock] = text_series.str.contains(stock)
    
    batch_size = df.shape[0]/10 # e.g. divide your df in 10 chunks
    for i in range(0,df.shape[0],batch_size): #batch_size is the step
       for stock in stocks:
          df[i:i+batch_size][stock] = text_series[i:i+batch_size].str.contains(stock)
    

    注意:您的数据库必须能被10整除,否则请选择另一个除数

    我想将其保存到csv,但必须先生成结果。这并不是因为我没有足够的内存,而且我在中途遇到了内存错误。我会看看第二种方法是否有效,但我相信我的代码需要一个更基本的更改,比如保存中间步骤。将其分成批这似乎是最好的选择。谢谢(顺便说一句,我想投你一票,但我不能!)如果你能选择它作为最佳答案,我将不胜感激。我也是新来的,所以我不知道你能不能。