首页 > 解决方案 > 基于正则表达式中定义的其他变量的总和创建变量的单线?

问题描述

我对 R 非常熟悉,刚开始尝试自学 python。我正在尝试复制以下代码行:

regex <- paste0("precip_pday_", 30:185, collapse = "|")
dat$TAP <- rowSums(dat[,grepl(regex, colnames(dat))])/1000

基本上只需创建一个正则表达式,然后将与正则表达式匹配的变量逐行求和。我想我可以很容易地不折叠字符串并使用%in%.

我试图在 python 中复制它,我能做的最好的就是嵌套的 for 循环和 if 语句,需要 15 行:

import re
import pandas as pd
regex = re.compile("precip")
idx = []
for i in range(0, len(list(df))-1, 1):
    name = list(df)[i]
    found = regex.findall(name)
    if len(found) > 0:
        day = name.split("_")[2]
        if int(day) in range(30, 185, 1):
            idx.append(i)

cols_I_want = df.iloc[:,idx]
df["TAP"] = cols_I_want.sum(axis = 1)/1000

这怎么能简化呢?变得更有效率?

这是一个假数据集,用于完成 MWE:

fake_df <- as.data.frame(matrix(rnorm(1000*365), nrow = 1000, ncol = 365))
colnames(fake_df) <- paste0("precip_pday_", 1:365)
write.csv("fake_df.csv")
df <- read.csv("fake_df.csv")

而且当然

df = pd.read_csv("fake_df.csv")

下面是部分的df样子:

ddd.iloc[[1,2,3],[1,2, 365]
]
Out[58]: 
   precip_pday_1  precip_pday_2  precip_pday_365
1       -1.189000       -0.825324          0.300221
2       -1.045318       -1.092792          1.098239
3        1.429858        0.919119         -0.643524

它有一年中每一天的列(以及我真实数据集中的许多其他列,但我可以使用正则表达式将它们过滤掉)。

所需的输出是第 30 天到第 185 天的值的总和

标签: pythonrregexpandas

解决方案


推荐阅读