pandas python 将一些列转换为行

pandas python convert some columns into rows

正在尝试将单个数据框列转换为一行。我使用以下代码抓取网站:

import requests
from bs4 import BeautifulSoup
import pandas as pd

URL = 'https://www.kemendag.go.id/id'
page = requests.get(URL)
soup = BeautifulSoup(page.content, 'html.parser')

table =soup.select('table')[1]
columns = table.find_all('thead')
column_ = []
for column in columns:
    cols = column.find_all('th')
    cols = [item.text.strip() for item in cols]
    column_.append([item for item in cols if item])
rows = table.find_all('tr')
output = []
for row in rows:
    x = row.find_all('td')
    x = [item.text.strip() for item in x]
    output.append([item for item in x if item])
df = pd.DataFrame(output, columns=column_)

这是输出看起来像:

    Tahun   Jan     Feb     Mar     Apr     Mei     Jun     Jul     Ags     Sep     Okt     Nov  
0   2020    0.39    0.28    0.10    0.08    0.07    0.18    -0.10   -0.05   -0.05   0.07    0.28
1   2021    0.26    0.10    0.08    0.13    0.32    -0.16   0.08    0.00    0.00    0.00    0.00    

我希望它看起来像:

Tahun Month Value
2020  Jan   0.39
2020  Feb   0.28
2020  Mar   0.10
2020  Apr   0.08
2020  Mei   0.07
2020  Jun   0.18
2020  Jul   -0.10
2020  Ags   -0.05
2020  Sep   -0.05
2020  Okt   0.07
2020  Nov   0.28
2021  Jan   0.26
2021  Feb   0.10
2021  Mar   0.08
2021  Apr   0.13
2021  Mei   0.32
2021  Jun   -0.16
2021  Jul   0.08
2021  Ags   0.00
2021  Sep   0.00
2021  Okt   0.00
2021  Nov   0.00

问题是我试过了

df.melt(id_vars=["Tahun"], 
        var_name="Month", 
        value_name="Value")

但出现错误 TypeError: only integer scalar arrays can be converted to a scalar index,知道吗?谢谢我也试过了

print(
    df.set_index(["Tahun"])
    .stack()
    .reset_index(name="Value")
    .rename(columns={"level_2": "Month"})
    .sort_values("Month")
    .reset_index(drop=True)
)

得到同样的错误

columns 中的问题是 MultiIndex:

print (df.columns)
MultiIndex([('Tahun',),
            (  'Jan',),
            (  'Feb',),
            (  'Mar',),
            (  'Apr',),
            (  'Mei',),
            (  'Jun',),
            (  'Jul',),
            (  'Ags',),
            (  'Sep',),
            (  'Okt',),
            (  'Nov',),
            (  'Des',)],
           )

可能的解决方案:

df = pd.DataFrame(output, columns=column_[0])

或:

column_ = []
for column in columns:
    cols = column.find_all('th')
    cols = [item.text.strip() for item in cols]
    column_.extend([item for item in cols if item])
...

df = pd.DataFrame(output, columns=column_)

melt 的最后一个解决方案运行良好。

它很脏,但它完成了工作...

df_1 = pd.DataFrame(np.repeat(df.iloc[:, :1].values, 12, axis=0), columns=["Tahun"])
df_2 = (df.iloc[0][1:].append(df.iloc[1][1:])
                      .to_frame()
                      .reset_index()
                      .rename(columns={"level_0":"Month", 0:"Value"}))
final_df = pd.concat([df_1, df_2], axis=1)