【问题标题】:Search through a dataframe using Regex in a for loop to pull out a value associated with the Regex在 for 循环中使用 Regex 搜索数据框以提取与 Regex 关联的值
【发布时间】:2022-01-13 15:22:49
【问题描述】:

我有一个来自更大数据框的子集数据框。我需要能够创建一个 for 循环来搜索数据框并提取与正确名称对应的数据。

import pandas as pd
import numpy as np
import re

data = {'Name': ['CH_1', 'CH_2', 'CH_3', 'FV_1', 'FV_2', 'FV_3'],
        'Value': [1, 2, 3, 4, 5, 6]
            }

df = pd.DataFrame(data)

FL = [17.7, 60.0]
CH = [20, 81.4]

tol = 8
time1 = FL[0] + tol
time2 = FL[1] + tol
time3 = CH[0] + tol
time4 = CH[1] + tol
FH_mon = df['Values'] *5
workpercent = [.7, .92, .94]
mhpy = [2087, 2503, 3128.75]
list1 = list()
list2 = list()

for x in df['Name']:
    if x == [(re.search('FV_', s)) for s in df['Name'].values]:
        y = np.select([FH_mon < time1 , (FH_mon >= time1) and (FH_mon < time2), FH_mon > time2], [workpercent[0],workpercent[1],workpercent[2]])
        z = np.select([FH_mon < time1 , (FH_mon >= time1) and (FH_mon < time2), FH_mon > time2], [mhpy[0],mhpy[1],mhpy[2]])   
    if x == [(re.search('CH_', s)) for s in df['Name'].values]:
       y = np.select([FH_mon < time3, (FH_mon >= time3) and (FH_mon < time4)],  [workpercent[0],workpercent[1]])
       z = np.select([FH_mon < time3, (FH_mon >= time3) and (FH_mon < time4)],  [mhpy[0],mhpy[1]])

list1.append(y)
list2.append(z)

我之前有一个简单的版本,我只是添加了几个数字,我得到了非常有用的答案来回答我的问题,但这里是更复杂的版本。我需要搜索,只要 name 列中有 FV,if 循环就会运行并将 Name 列中的数据与 FV 一起使用。 CH 也一样。当循环遍历名称列时,我有列表来跟踪每个值。如果有更简单的方法,我真的很感激看到它,但现在这似乎是最干净的方法,但我收到错误,否则循环将无法正常运行。

【问题讨论】:

    标签: python dataframe for-loop


    【解决方案1】:

    这应该是你想要的:

    for index, row in df.iterrows(): 
        if re.search("FV_", row["Name"]): 
            df.loc[index, "Value"] += 2 
        elif re.search("CH_", row["Name"]): 
            df.loc[index, "Value"] += 4
    

    【讨论】:

      【解决方案2】:

      如果“名称”列只有以“FV_”或“CH_”开头的值,请使用where

      df["Value"] = df["Value"].add(2).where(df["Name"].str.startswith("FV_"), df["Value"].add(4))
      

      如果“名称”中可能有其他值,请使用numpy.select

      import numpy as np
      
      df["Value"] = np.select([df["Name"].str.startswith("FV_"), df["Name"].str.startswith("CH_")], [df["Value"].add(2), df["Value"].add(4)])
      
      输出:
      >>> df
         Name  Value
      0  CH_1      5
      1  CH_2      6
      2  CH_3      7
      3  FV_1      6
      4  FV_2      7
      5  FV_3      8
      

      【讨论】:

        猜你喜欢
        • 2013-10-07
        • 1970-01-01
        • 2020-05-02
        • 2017-09-01
        • 2015-05-24
        • 2023-03-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-21
        相关资源
        最近更新 更多