我对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天的值的总和