在多列上迭代和应用正则表达式函数/str 计数
Posted
技术标签:
【中文标题】在多列上迭代和应用正则表达式函数/str 计数【英文标题】:Iterating and Applying Regex functions/str counts over multple columns 【发布时间】:2022-01-06 10:31:17 【问题描述】:我是 python 新手,正在尝试改进这个测试 df。我能够应用正则表达式函数来查找单元格中的模式,然后向我提供单个列级别上有多少个 1 的计数。下面是将函数单独应用于列的原始和结果 df 的图像,以及各个列的代码。下面也是测试 df 的文本版本(图片中缺少一行以使其更容易共享/图像与测试 df 不匹配,但结果相似):
import pandas as pd
df = pd.DataFrame([["1 | | Had a Greeter welcome clients 1 | | Take measures to ensure a safe and organized distribution 1 | | Protected confidentiality of clients (on social media, pictures, in conversation, own congregation members receiving assistance, etc.)",
"1 | | Chairs for clients to sit in while waiting 1 | | Take measures to ensure a safe and organized distribution"],
["1 | Financial literacy/budgeting 1 | | Monetary/Bill Support 1 | | Mental Health Services/Counseling",
"1| | Clothing Assistance 1 | | Healthcare 1 | | Mental Health Services/Counseling 1 | | Spiritual Support 1 | | Job Skills Training"]
] , columns = ['CF1', 'CF2'])
pattern = re.compile(r'\d+')
df['CF1test'] = df['CF1'].apply(lambda x: '_'.join(pattern.findall(x))).str.count(pattern)
df['CF2test'] = df['CF2'].apply(lambda x: '_'.join(pattern.findall(x))).str.count(pattern)
这是我试图开发的一个循环示例,用于迭代并将相同的函数应用于多个列:
for column in df:
df[column] = df.join([column](df.apply(lambda x: '_'.join(pattern.findall(x))).str.count(pattern), rsuffix = '_test'))
但是,我收到“TypeError:预期的字符串或类似字节的对象”,我迷路了。有没有更好的方法可用?任何建议都会很棒!
【问题讨论】:
请以文本的形式提供您的输入数据 嗨@mozay。循环的输入数据与第一张图像相同。我正在尝试遍历结构类似于 CF1 和 CF2 的多个列(即计算所有由 '|' 分隔的 1。 图片≠文字;)我不能使用图片(请阅读this) 我很抱歉! @Mozay 我将编辑问题以包含文本! @mozay 希望这会奏效!感谢您提供任何建议 【参考方案1】:您可以stack
您的数据框并将extractall
与您的模式一起使用:
(df.stack().str.extractall('(\d+)')[0]
#.astype(int) # conversion to int is only required for other operations, like sum
.groupby(level=[0,1]).count().unstack())
输出:
CF1 CF2
0 3 2
1 3 5
注意。我在这里计算数字(“test123”中的任何数字“42”或“123”都将被计算在内),如果您只想限制为 1,您可以调整正则表达式,并且如果您愿意,您还可以执行其他操作,例如求和而不是计数
【讨论】:
这很好用!谢谢!!以上是关于在多列上迭代和应用正则表达式函数/str 计数的主要内容,如果未能解决你的问题,请参考以下文章