我正在使用 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
关于python - 使用 for 循环在 pandas 中附加多个数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53926323/