R代码转Python时seq函数及[[1]][i]索引的转换问题
R转Python问题解决方案
1. 序列生成等效实现
R中seq(1, size, by=2)是生成从1开始、步长固定为2、最大值不超过size的整数序列,你之前使用np.linspace不符合需求的原因是该函数用于生成固定数量的等距序列,默认返回浮点型结果。你可以直接使用以下两种方案实现完全等效的输出:
- 基于numpy实现:你现有代码中的
sequence = np.arange(1, table_Size, 2)逻辑正确,返回结果就是1、3、5...33的整数序列,和R输出完全一致 - 不依赖numpy实现:直接用Python内置range对象
sequence = range(1, table_Size, 2),遍历效果完全相同
2. 索引转换等效实现
首先需要先修正你读文件的代码逻辑,原R代码用sep="\n"读取文件,将每一行作为第一列的单独值存储,你Python代码中用sep=";"会导致列拆分错误,先调整读取逻辑:
table_NameUrl = pd.read_csv("DadosPanu.txt", sep="\n", header=None)
R和Python的索引规则差异以及对应转换逻辑如下:
- R中
[[1]]是取数据框的第一列(R索引从1开始),对应pandas中取第一列用iloc[:, 0](Python索引从0开始) - R中行索引从1开始,Python中行索引从0开始,所以R中取第i行的逻辑对应Python中取第i-1行
因此R中的[[1]][i]和[[1]][i+1]对应的Python代码为:
# R的[[1]][i]对应 tableName = table_NameUrl.iloc[i-1, 0] # R的[[1]][i+1]对应 tableUrl = table_NameUrl.iloc[i, 0]
完整修正后代码
import pandas as pd import numpy as np table_NameUrl = pd.read_csv("DadosPanu.txt", sep="\n", header=None) table_Size = len(table_NameUrl) sequence = np.arange(1, table_Size, 2) for i in sequence: tableName = table_NameUrl.iloc[i-1, 0] tableUrl = table_NameUrl.iloc[i, 0] fileName = f"{tableName}.csv" ro.globalenv['fileName'] = fileName last_url = "/n3/all/n6/in%20n3%2028" url = f"{tableUrl}{last_url}" ro.globalenv['url'] = url ro.r('table= get_sidra(api= url)') ro.r('write.csv(table, file= fileName, row.names = F)')
内容的提问来源于stack exchange,提问作者Thiago Santana
相关产品推荐
相关产品推荐

