Добавление нескольких кадров данных в пандах с помощью циклов for - PullRequest
0 голосов
/ 26 декабря 2018

Я читаю таблицы из Интернета, используя pd.read_html и использую цикл for в pandas, чтобы создать один фрейм данных из нескольких фреймов данных.Я могу успешно создать фрейм данных для любого данного года, но мне не хватает правильной логики в цикле for:

(1) Чтение данных, (2) создание фрейма данных (3) Goна следующий год и (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

Ответы [ 2 ]

0 голосов
/ 26 декабря 2018

Подумайте о создании списка фреймов данных, а затем объедините элементы один раз вне цикла.В частности, ниже используется понимание списка, которое также назначает столбцы в каждой итерации, после чего следует вызов 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
0 голосов
/ 26 декабря 2018

Возможно, вы хотите что-то вроде этого:

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 в цикле, так как это может вызвать проблемы с памятью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...