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)
正在尝试将单个数据框列转换为一行。我使用以下代码抓取网站:
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)