我正在使用pd.read_html从Web上读取表,并在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
答案 0 :(得分:3)
考虑建立一个数据帧列表,然后在循环外连接项目。具体来说,下面使用列表推导,该列表推导还在每次迭代中分配列,然后进行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
答案 1 :(得分:0)
您可能想要这样的东西:
myDataFrame = pd.DataFrame()
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
myDataFrame = myDataFrame.append(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
编辑:请参阅@Parfait的评论。显然,您不应该在循环中使用DataFrame.append,因为它可能会导致内存问题。