首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想提取一个单词后,一个固定的组合词和特殊字符,也需要计数提取的单词在特定的单元格。

我想提取一个单词后,一个固定的组合词和特殊字符,也需要计数提取的单词在特定的单元格。
EN

Stack Overflow用户
提问于 2022-10-15 10:41:54
回答 1查看 42关注 0票数 1

我有一个数据帧df,它有一个列。我想在一个固定的词组合后提取一个单词&特殊字符,也需要一个特定单元格中提取的单词数。

例如:(最近的警报触发器)“、”valueString“:”倾斜传感器“、”最新的警报触发器“、”valueString“:”Hello world“、(最新的警报触发器)、”valueString“:”ABC“,

现在,从上面的行中,我想在“(最近的警报触发器)”、“valueString”之后在逗号之间提取任何单词:

因此,在这种情况下,我只想要‘倾斜传感器’和它的计数在特定的细胞。

我不需要‘你好世界’或'ABC‘,因为它是第二或第三。基本上我要的是第一个搜索词。

以下是我的df:-

代码语言:javascript
复制
import re
import pandas as pd
import numpy as np



data = {'product_name': ["[{'name':'Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'Tilt Sensor','packetType':'enumerated','leastSigBit':440,,'Tilt Sensor','mostSigBit':447},{'name':'User Set Year (Most Recent Alarm Trigger)', (Most Recent Alarm Trigger)','valueString':'Band','valueNumber':2022.0,'units':'Undefined / Not Used','packetType':'Tilt Sensor','leastSigBit':432,'mostSigBit':439},{'name':'User Set Month,(Most Recent Alarm Trigger)','valueString':'Back space',{'name':'User Set Minute (Most Recent Alarm Trigger)','valueNumber':16.0,'units':'min','packetType':'unsigned','leastSigBit':400,'mostSigBit':407},'Tilt Sensor',{'name':'User Set Second (Most Recent Alarm Trigger)','valueNumber':36.0,'units':'s','packetType':'unsigned','leastSigBit':392,'mostSigBit':399}]",
                         "[{'name':'Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'Volumetric Sensor','packetType':'enumerated','leastSigBit':440,'mostSigBit':447},{'name':'User Set Year (Most Recent Alarm Trigger)','valueNumber':2022.0,'units':'(Most Recent Alarm Trigger)','valueString':'Being human','packetType':'unsigned','leastSigBit':432,'mostSigBit':439},{'name':'User Set Month (Most Recent Alarm Trigger)','valueNumber':6.0,'(Most Recent Alarm Trigger)','valueString':'Hello'':'Month','Volumetric Sensor','packetType':'unsigned','leastSigBit':424,'mostSigBit':431},{'name':'User Set Day (Most Recent Alarm ]"]}
df = pd.DataFrame(data)
df

我尝试了regex或应用方法,但没有得到我想要的。

下面是一些我尝试过的代码,

代码语言:javascript
复制
df["Extract"] = df["product_name"].apply(lambda st: st[st.find("(Most Recent Alarm Trigger)','valueString':")+1:st.find(",")])

df['Title'] = df.product_name.str.extract(r'"(Most Recent Alarm Trigger)','valueString':'"\s*([^\.]*)\s*\.', expand=False)

以下是我的预期结果:

代码语言:javascript
复制
data = {'product_name': ["[{'name':'Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'Tilt Sensor','packetType':'enumerated','leastSigBit':440,,'Tilt Sensor','mostSigBit':447},{'name':'User Set Year (Most Recent Alarm Trigger)', (Most Recent Alarm Trigger)','valueString':'Band','valueNumber':2022.0,'units':'Undefined / Not Used','packetType':'Tilt Sensor','leastSigBit':432,'mostSigBit':439},{'name':'User Set Month,(Most Recent Alarm Trigger)','valueString':'Back space',{'name':'User Set Minute (Most Recent Alarm Trigger)','valueNumber':16.0,'units':'min','packetType':'unsigned','leastSigBit':400,'mostSigBit':407},'Tilt Sensor',{'name':'User Set Second (Most Recent Alarm Trigger)','valueNumber':36.0,'units':'s','packetType':'unsigned','leastSigBit':392,'mostSigBit':399}]",
                             "[{'name':'Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'Volumetric Sensor','packetType':'enumerated','leastSigBit':440,'mostSigBit':447},{'name':'User Set Year (Most Recent Alarm Trigger)','valueNumber':2022.0,'units':'(Most Recent Alarm Trigger)','valueString':'Being human','packetType':'unsigned','leastSigBit':432,'mostSigBit':439},{'name':'User Set Month (Most Recent Alarm Trigger)','valueNumber':6.0,'(Most Recent Alarm Trigger)','valueString':'Hello'':'Month','Volumetric Sensor','packetType':'unsigned','leastSigBit':424,'mostSigBit':431},{'name':'User Set Day (Most Recent Alarm ]"],
       'Extarct': ['Tilt Sensor','Volumetric Sensor'],'Count': [4,2]}
df = pd.DataFrame(data)
df
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-15 11:22:59

一种解决办法可以如下:

\',.

  • Next,
  • 使用Series.str.extract来获得\'valueString\':\'df.apply之间的第一次匹配--使用df.apply为每一行(axis=1)提供一个lambda函数,以获得现在存储在适当product_name字符串中的df.Extract中的每个值的计数。

代码语言:javascript
复制
import pandas as pd

# also adding the string from your comment
data = {'product_name': ["[{'name':'Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'Tilt Sensor','packetType':'enumerated','leastSigBit':440,,'Tilt Sensor','mostSigBit':447},{'name':'User Set Year (Most Recent Alarm Trigger)', (Most Recent Alarm Trigger)','valueString':'Band','valueNumber':2022.0,'units':'Undefined / Not Used','packetType':'Tilt Sensor','leastSigBit':432,'mostSigBit':439},{'name':'User Set Month,(Most Recent Alarm Trigger)','valueString':'Back space',{'name':'User Set Minute (Most Recent Alarm Trigger)','valueNumber':16.0,'units':'min','packetType':'unsigned','leastSigBit':400,'mostSigBit':407},'Tilt Sensor',{'name':'User Set Second (Most Recent Alarm Trigger)','valueNumber':36.0,'units':'s','packetType':'unsigned','leastSigBit':392,'mostSigBit':399}]",
                         "[{'name':'Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'Volumetric Sensor','packetType':'enumerated','leastSigBit':440,'mostSigBit':447},{'name':'User Set Year (Most Recent Alarm Trigger)','valueNumber':2022.0,'units':'(Most Recent Alarm Trigger)','valueString':'Being human','packetType':'unsigned','leastSigBit':432,'mostSigBit':439},{'name':'User Set Month (Most Recent Alarm Trigger)','valueNumber':6.0,'(Most Recent Alarm Trigger)','valueString':'Hello'':'Month','Volumetric Sensor','packetType':'unsigned','leastSigBit':424,'mostSigBit':431},{'name':'User Set Day (Most Recent Alarm ]",
                         "[{'name':'Power Mode Quality Factor','valueString':'Power Mode Undefined','valueString':'Finally',Trigger Cause Status (Most Recent Alarm Trigger)','valueString':'No Trigger (Event Store Empty)',}]"]}
df = pd.DataFrame(data)

df['Extract'] = df.product_name.str.extract(
    r'\(Most Recent Alarm Trigger\)\',\'valueString\':\'(.*?)\',')
# N.B. We're using the question mark to make the search for '.*' lazy

df['Count'] = df.apply(lambda row: row.product_name.count(row.Extract), axis=1)

print(df.iloc[:,1:])

                          Extract  Count
0                     Tilt Sensor      4
1               Volumetric Sensor      2
2  No Trigger (Event Store Empty)      1

注:如果str.extract无法找到匹配项,您将在df.Extract中得到NaN值。如果是这样的话,这将导致df.apply(lambda row: row.product_name.count(row.Extract), axis=1)的一个错误(因为它期待一个string)。为了避免这种情况,您可以使用:

代码语言:javascript
复制
df['Count'] = df.apply(lambda row: row.product_name.count(row.Extract) 
                       if isinstance(row.Extract,str) else 0, axis=1)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74078723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档