python - 使用 for 循环在 pandas 中附加多个数据帧
问题描述
我正在使用 pd.read_html 从网上读取表格,并在 pandas 中使用 for 循环从多个数据帧创建单个数据帧。我能够为任何给定年份成功创建数据框,但我在 for 循环中缺少正确的逻辑:
(1)读取数据,(2)创建一个数据框(3)转到下一年,(4)将该数据框附加到前一个数据框。
理想的结果应该是 1 个具有约 500 行和 13 列的数据框(用于 2 年的数据)。谢谢!
for x in range(2017, 2019):
dfs = pd.read_html('https://www.treasury.gov/resource-center/data-chart-center/interest-rates/pages/TextView.aspx?data=yieldYear&year=(%d)' % x, skiprows=1)
for df in dfs:
print df
DateList = ['Date', '1 mo', '2 mo', '3 mo', '6 mo', '1 yr', '2 yr', '3 yr', '5 yr', '7 yr', '10 yr', '20 yr', '30 yr']
df.columns = DateList
解决方案
考虑构建一个数据框列表,然后在循环外连接项目。具体来说,下面使用了一个列表推导,它也在每次迭代中分配列,然后是一个pd.concat
调用。
url = 'https://www.treasury.gov/resource-center/data-chart-center/interest-rates/' + \
'pages/TextView.aspx?data=yieldYear&year=({yr})'
DateList = ['Date', '1 mo', '2 mo', '3 mo', '6 mo', '1 yr', '2 yr',
'3 yr', '5 yr', '7 yr', '10 yr', '20 yr', '30 yr']
dfs = [(pd.read_html(url.format(yr=x), skiprows=1)[1]
.set_axis(DateList, axis='columns', inplace=False)) for x in range(2017, 2019)]
final_df = pd.concat(dfs, ignore_index=True)
print(final_df.head())
# Date 1 mo 2 mo 3 mo 6 mo ... 5 yr 7 yr 10 yr 20 yr 30 yr
# 0 01/03/17 0.52 NaN 0.53 0.65 ... 1.94 2.26 2.45 2.78 3.04
# 1 01/04/17 0.49 NaN 0.53 0.63 ... 1.94 2.26 2.46 2.78 3.05
# 2 01/05/17 0.51 NaN 0.52 0.62 ... 1.86 2.18 2.37 2.69 2.96
# 3 01/06/17 0.50 NaN 0.53 0.61 ... 1.92 2.23 2.42 2.73 3.00
# 4 01/09/17 0.50 NaN 0.50 0.60 ... 1.89 2.18 2.38 2.69 2.97
推荐阅读
- three.js - 在自定义着色器中包含凹凸贴图/镜面贴图
- gnuplot - Gnu 绘制带标题的水平条形图
- scala - Scala 枚举 - Java.lang.UnsupportedOperationException
- javascript - React Native 过滤器查询
- c++ - clang 编译的模块 pcm 文件有什么用?
- node.js - 如何在节点js中导入boxicons
- reactjs - 使用 redux 单击时应用和重置多个过滤器
- algorithm - 在给定偏差/比例下找到多个输入的“中间”的算法
- react-native - 在 OneSignal 中使用挂钩
- rust - 使用线程和通道的 Rust 代码恐慌