对变量名使用迭代器的替代方法

Posted

技术标签:

【中文标题】对变量名使用迭代器的替代方法【英文标题】:Alternatives to using an interator for variable names 【发布时间】:2021-06-08 11:25:33 【问题描述】:

我对 Python 比较陌生,来自 Stata 背景,并且仍在为一些核心 Python 概念而苦苦挣扎。例如,我目前正在开发一个小程序,该程序点击US Census Bureau API 对一些地址进行地理编码,我的直觉是遍历我的 csv 文件,将它们输入 API 调用,然后使用顺序命名输出迭代器。例如

import censusgeocode
import json
import pandas as pd

cg = censusgeocode.CensusGeocode()
for i in range(1,3):
    k = cg.addressbatch('dta/batchfiles/split_test ' + str(i) + '.csv')
    json_string = json.dumps(k)
    test_i = pd.read_json(json_string)

我知道test_i 语法不正确并且会返回错误,但以上内容让您了解我在概念上尝试做的事情。但是,我在其他地方(例如this SO post)读到这在 Python 中不是一个好方法。 有人可以告诉我什么是更好的方法吗? 将所有 ks 一起附加到一个巨大的 json 文件中然后一次性转换它们会更好吗?如果是这样,我该怎么做?

我有数百个要循环的 csv 文件,在为每个文件调用 API 后,我想将它们全部附加到一个数据帧中——我不确定这是否有用,但只是想在哪里交流想要最终到达。

任何帮助将不胜感激!

【问题讨论】:

这能回答你的问题吗? How do I create variable variables? 【参考方案1】:

也许您可以创建一个主 DataFrame 并向其添加一个表示 i 的额外字段,然后,在循环遍历您的 CSV 文件时,您可以将数据加载为新 DataFrame,将 i-field 添加到每一行并append 读取数据到您的主 DataFrame。

附言在k = cg.addressbatch('dta/batchfiles/split_test ' + str(i) + '.csv') 为此,我建议使用 os.path.join()

【讨论】:

嗨,马可,非常感谢。请问使用os.path.join()有什么好处? 一个优点是,例如,如果您在使用不同路径名分隔符的操作系统上运行程序(例如 windows 与 linux),它仍然可以工作。 os.path 也有一套非常有用的处理路径的工具,值得一看 :) 太棒了。再次感谢!我会调查的【参考方案2】:

你真的不想通过json!

addressbatch 返回一个很好的 dicts 列表,可以直接用于平滑地输入 pandas DataFrame。

所以你有两种方法:构建一个大的字典列表并最终构建数据框:

data = []
for i in range(1,3):
    k = cg.addressbatch('dta/batchfiles/split_test ' + str(i) + '.csv')
    data.extend(k)         # add the new rows to the main list

df = pd.DataFrame(data)

另一种方法是为每个 csv 文件构建一个数据框,将其存储到一个列表中并在最后连接所有内容:

dfs = []
for i in range(1,3):
    k = cg.addressbatch('dta/batchfiles/split_test ' + str(i) + '.csv')
    dfs.append(pd.DataFrame(k))

df = pd.concat(dfs)

这两种方法大致相同。在我的测试中,第一个似乎效率更高一些,但数量级相同。

【讨论】:

以上是关于对变量名使用迭代器的替代方法的主要内容,如果未能解决你的问题,请参考以下文章

装饰器生成器迭代器

生成器迭代器的区别?

Python教程:迭代器的正确使用方法

迭代器的解释

C ++中反向迭代器的非常奇怪的行为

JAVA基础——集合Iterator迭代器的实现