[英]How to convert a pandas dataframe to matrix format in Python?
我有一個 pandas dataframe df
,如圖所示。 (最后給出了df.to_dict()
):
model scenario module
AIM/CGE 2.0 ADVANCE_2020_1.5C-2100 wind_total_share high high
SSP1-19 wind_total_share high high
SSP2-19 wind_total_share high high
AIM/CGE 2.1 CD-LINKS_NPi2020_400 wind_total_share high high
TERL_15D_LowCarbonTransportPolicy wind_total_share medium medium
TERL_15D_NoTransportPolicy wind_total_share medium medium
GCAM 4.2 SSP1-19 wind_total_share medium medium
IMAGE 3.0.1 IMA15-AGInt wind_total_share low low
IMA15-Def wind_total_share low low
IMA15-Eff wind_total_share low low
model
、 scenario
和module
是索引,而Infrastructure
和Investment
是 dataframe 的兩列。我想將這兩列轉換為矩陣格式,其中 Infrastructure 類似於 x 軸,Investment 類似於 Y 軸。 此外,在基礎設施和投資方面,我需要將它們分為低、中和高。 在單元格中,我想要 model 的名稱和滿足給定變量(投資基礎設施)的給定類別(低/中/高)的場景,如下面的屏幕截圖所示。 也可能存在這樣的情況,即基礎設施的情景較高,而投資的情景較低或中等,反之亦然。
我還想要另一個矩陣,它顯示屬於給定單元格的場景數。 第二個矩陣矩陣應如下所示:
我不熟悉通過修改現有的 pandas dataframe 來獲得這種矩陣格式。是否有任何功能或模塊可用於此目的? 如何使用 Python 將我的 dataframe 轉換為屏幕截圖所示的矩陣格式?
df.to_dict()
看起來如下:
{'Infrastructure': {('AIM/CGE 2.0',
'ADVANCE_2020_1.5C-2100',
'wind_total_share'): 'high',
('AIM/CGE 2.0', 'SSP1-19', 'wind_total_share'): 'high',
('AIM/CGE 2.0', 'SSP2-19', 'wind_total_share'): 'high',
('AIM/CGE 2.1', 'CD-LINKS_NPi2020_400', 'wind_total_share'): 'high',
('AIM/CGE 2.1',
'TERL_15D_LowCarbonTransportPolicy',
'wind_total_share'): 'medium',
('AIM/CGE 2.1', 'TERL_15D_NoTransportPolicy', 'wind_total_share'): 'medium',
('GCAM 4.2', 'SSP1-19', 'wind_total_share'): 'medium',
('IMAGE 3.0.1', 'IMA15-AGInt', 'wind_total_share'): 'low',
('IMAGE 3.0.1', 'IMA15-Def', 'wind_total_share'): 'low',
('IMAGE 3.0.1', 'IMA15-Eff', 'wind_total_share'): 'low'},
'Investment': {('AIM/CGE 2.0',
'ADVANCE_2020_1.5C-2100',
'wind_total_share'): 'high',
('AIM/CGE 2.0', 'SSP1-19', 'wind_total_share'): 'high',
('AIM/CGE 2.0', 'SSP2-19', 'wind_total_share'): 'high',
('AIM/CGE 2.1', 'CD-LINKS_NPi2020_400', 'wind_total_share'): 'high',
('AIM/CGE 2.1',
'TERL_15D_LowCarbonTransportPolicy',
'wind_total_share'): 'medium',
('AIM/CGE 2.1', 'TERL_15D_NoTransportPolicy', 'wind_total_share'): 'medium',
('GCAM 4.2', 'SSP1-19', 'wind_total_share'): 'medium',
('IMAGE 3.0.1', 'IMA15-AGInt', 'wind_total_share'): 'low',
('IMAGE 3.0.1', 'IMA15-Def', 'wind_total_share'): 'low',
('IMAGE 3.0.1', 'IMA15-Eff', 'wind_total_share'): 'low'}}
pivot_table
在這里可以提供幫助。
第二個矩陣可以直接獲得:
df.assign(values=1).pivot_table(values='values', index='Infrastructure',
columns='Investment', aggfunc=sum)
這使:
Investment high low medium
Infrastructure
high 4.0 NaN NaN
low NaN 3.0 NaN
medium NaN NaN 3.0
對於第一個,您可以先重置索引以構建預期值:
temp = df.reset_index(2, drop=True).reset_index()
temp['value'] = temp['level_0'] + ' ' + temp['level_1']
df2 = temp.pivot_table(values = 'value', index='Infrastructure',
columns='Investment', aggfunc=list)
在df2
中,多個標識符被分組在一個列表中。 如果你想每行一個,你可以展開 dataframe:
df2.explode('high').explode('medium').explode('low')
要得到
Investment high low medium
Infrastructure
high AIM/CGE 2.0 ADVANCE_2020_1.5C-2100 NaN NaN
high AIM/CGE 2.0 SSP1-19 NaN NaN
high AIM/CGE 2.0 SSP2-19 NaN NaN
high AIM/CGE 2.1 CD-LINKS_NPi2020_400 NaN NaN
low NaN IMAGE 3.0.1 IMA15-AGInt NaN
low NaN IMAGE 3.0.1 IMA15-Def NaN
low NaN IMAGE 3.0.1 IMA15-Eff NaN
medium NaN NaN AIM/CGE 2.1 TERL_15D_LowCarbonTransportPolicy
medium NaN NaN AIM/CGE 2.1 TERL_15D_NoTransportPolicy
medium NaN NaN GCAM 4.2 SSP1-19
我進行了一段時間的頭腦風暴,然后自己想出了解決方案。 它很長,但它看起來像這樣。
首先,我分別列出了基礎設施和投資的高、中、低場景:
infra_high = (df[df["Infrastructure"]=="high"].index.get_level_values(0) + " " + df[df["Infrastructure"]=="high"].index.get_level_values(1)).to_list()
infra_medium = (df[df["Infrastructure"]=="medium"].index.get_level_values(0) + " " + df[df["Infrastructure"]=="medium"].index.get_level_values(1)).to_list()
infra_low = (df[df["Infrastructure"]=="low"].index.get_level_values(0) + " " + df[df["Infrastructure"]=="low"].index.get_level_values(1)).to_list()
invest_high = (df[df["Investment"]=="high"].index.get_level_values(0) + " " + df[df["Investment"]=="high"].index.get_level_values(1)).to_list()
invest_medium = (df[df["Investment"]=="medium"].index.get_level_values(0) + " " + df[df["Investment"]=="medium"].index.get_level_values(1)).to_list()
invest_low = (df[df["Investment"]=="low"].index.get_level_values(0) + " " + df[df["Investment"]=="low"].index.get_level_values(1)).to_list()
接下來,我做了高,高場景的交集; 基礎設施和投資的高、中、高、低如下:
i1 = list(set(infra_high).intersection(set(invest_high)))
i2 = list(set(infra_high).intersection(set(invest_medium)))
i3 = list(set(infra_high).intersection(set(invest_low)))
i4 = list(set(infra_medium).intersection(set(invest_high)))
i5 = list(set(infra_medium).intersection(set(invest_medium)))
i6 = list(set(infra_medium).intersection(set(invest_low)))
i7 = list(set(infra_low).intersection(set(invest_high)))
i8 = list(set(infra_low).intersection(set(invest_medium)))
i9 = list(set(infra_low).intersection(set(invest_low)))
接下來,使用 Excel 文件,我重新創建了我想要制作的矩陣:
然后,我為 dataframe 的每個單元分配列表,如下所示:
landing_zone1.loc["High","High"] = i1
landing_zone1.loc["High","Medium"] = i2
landing_zone1.loc["High","Low"] = i3
landing_zone1.loc["Medium","High"] = i4
landing_zone1.loc["Medium","Medium"] = i5
landing_zone1.loc["Medium","Low"] = i6
landing_zone1.loc["Low","High"] = i7
landing_zone1.loc["Low","Medium"] = i8
landing_zone1.loc["Low","Low"] = i9
我使用每個列表的len()
對場景數量矩陣做了同樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.