如何将数据帧展平为一行并更改列,使列为:“column1.index1”、“column1.index2”等

2024-09-29 23:23:41 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用For循环和pd.read\u html函数来刮表

每个html有17个表

我首先从一个excel文件中取出标记,并将它们转换成一个列表。然后,我将其贯穿:

import pandas as pd

df = pd.read_excel('C:/Users/Jacob/Downloads/CEF Tickers.xlsx', sheet_name='Sheet1')

tickers_list = df['Ticker'].tolist()

# There are some test tickers: ["ASA", "FAX", "IAF"]

df_list1 = []

for ticker in tickers_list:
    df_list1.append(pd.read_html(f'https://www.cefconnect.com/fund/{ticker}', header=0)[0])

这里我从每个pd.html表刮取第一个数据帧。实际上有17张桌子被拉着。我的计划是:

df_list1 = []
df_list2 = []
...
df_list17 = []

for ticker in tickers_list:
    df_list1.append(pd.read_html(f'https://www.cefconnect.com/fund/{ticker}', header=0)[0])
    df_list2.append(pd.read_html(f'https://www.cefconnect.com/fund/{ticker}', header=0)[1])
    ...
    df_list17.append(pd.read_html(f'https://www.cefconnect.com/fund/{ticker}', header=0)[16])

df_list1中的数据帧看起来像this

我一直在寻找各种方法,试图将df_list1中的数据帧转换成this,但没有结果

当df_list1中的数据帧看起来像这样时,我可以使用pd.concat并将列表转换成一个大数据帧。然后将所有的df_列表1到df_列表17连接在一起,并将标记作为索引

我以前使用过pd.json_normalize函数来平展这样的数据集。我是否需要将每个数据帧转换为一个字典并执行相同的操作

谢谢大家抽出时间


Tags: 数据httpscomdf列表readhtmlwww
1条回答
网友
1楼 · 发布于 2024-09-29 23:23:41

试试这个,使用字典而不是列表,这样我就可以在连接的数据帧中跟踪我的标记,然后再重塑(展平):

tickers_list = ["ASA", "FAX", "IAF"]

df_list1 = {}

for ticker in tickers_list:
    df_list1[ticker]= pd.read_html(f'https://www.cefconnect.com/fund/{ticker}', header=0)[0]
    

df_out = pd.concat(df_list1, keys=df_list1.keys())
df_out = df_out.rename(columns={'Unnamed: 0': 'Prices'})
df_out = df_out.set_index('Prices', append=1).reset_index(level=1, drop=True).unstack()

df_out.columns = df_out.columns.map('_'.join)
df_out

输出:

  SharePrice_52 Wk Avg SharePrice_52 Wk High SharePrice_52 Wk Low SharePrice_Current NAV_52 Wk Avg NAV_52 Wk High NAV_52 Wk Low NAV_Current Premium/Discount_52 Wk Avg Premium/Discount_52 Wk High Premium/Discount_52 Wk Low Premium/Discount_Current
ASA               $15.32                $25.45                $8.16             $20.80        $18.08         $27.91        $10.55      $24.55                    -15.52%                      -8.05%                    -19.86%                  -15.27%
FAX                $3.99                 $4.49                $2.60              $3.87         $4.65          $4.90         $3.98       $4.62                    -14.29%                      -9.09%                    -30.05%                  -16.23%
IAF                $4.78                 $5.62                $2.99              $4.50         $5.31          $6.11         $3.45       $5.21                    -10.20%                      -4.38%                    -14.10%                  -13.63%

tickers_list = ["ASA", "FAX", "IAF"]

df_list1 = {}

for ticker in tickers_list:
    df_list1[ticker]= pd.read_html(f'https://www.cefconnect.com/fund/{ticker}', header=0)[1]
    

df_out = pd.concat(df_list1, keys=df_list1.keys())
#df_out = df_out.rename(columns={'Unnamed: 0': 'Prices'})
df_out = df_out.unstack()

df_out.columns = [f'{i}_{j}' for i, j in df_out.columns]
df_out

相关问题 更多 >

    热门问题