當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Python Pandas DataFrame wide_to_long方法用法及代碼示例

Pandas wide_to_long(~) 方法將 DataFrame 的格式從寬格式轉換為長格式。

讓我們看一個簡單的例子。假設我們有以下 DataFrame:

名字

年齡

高度

alex

40

150

bob

50

160

這被認為是一個寬的DataFrame 因為每一行都捕獲有關該人的所有相關數據。現在,將其轉換為 DataFrame :

名字

變量

alex

age

30

alex

height

150

bob

age

50

bob

height

160

現在,每一行捕獲有關該人的單個變量,這不可避免地會導致垂直 DataFrame 。

Pandas 使用這個術語"unpivot"表示基於變量延長 DataFrame 的操作。在這個例子中,我們是不旋轉變量ageheight.

參數

1. df | DataFrame

輸入數據幀。

2. stubnames | stringlist-like

將拉長的列標簽的前綴。

3. i | stringlist-like

用作標識符的列。

4. j | string

分配給新引入的列的名稱。

5. sep | string | optional

例如,如果您希望延長的列具有標簽 "A_2012" ,則您可以設置 stubnames="A"sep="_" ,而不是將 "A_" 指定為 stubnames 。默認情況下,sep=""

6. suffix | string | optional

與要延長的列後綴匹配的字符串或正則表達式。默認情況下,suffix="\d+"

返回值

列已取消透視的DataFrame。

例子

考慮以下 DataFrame :

df = pd.DataFrame({"name":["alex","bob","cathy"], "savings_2019":[10,20,30], "savings_2020":[40,50,60]})
df



   name   savings_2019  savings_2020
0  alex       10            40
1  bob        20            50
2  cathy      30            60

基本用法

從寬DataFrame變為長DataFrame:

pd.wide_to_long(df, stubnames=["savings_"], i="name", j="year")



             savings_
name   year	
alex   2019    10
bob    2019    20
cathy  2019    30
alex   2020    40
bob    2020    50
cathy  2020    60

在這裏,請注意下劃線是如何包含在存根名稱中的("savings_")。這是因為如果沒有 _ ,該方法將使用 "_2019" 之類的後綴,而不僅僅是數字 "2019" 來查找要取消透視的列標簽。這是一個問題,因為默認的 suffix 參數 ( "\d+" ) 僅允許數字。

這種方法的缺點是新的列名變成了 savings_ ,這無疑很尷尬。

指定 sep 參數

我們可以讓 stubnames"saving" 並設置 sep="_" 來獲得相同的行為,而不是 "saving_" 。這樣做的優點是我們的列名稱現在是 savings

pd.wide_to_long(df, stubnames=["savings"], i="name", j="year", sep="_")



             savings
name   year	
alex   2019    10
bob    2019    20
cathy  2019    30
alex   2020    40
bob    2020    50
cathy  2020    60

指定後綴參數

考慮以下 DataFrame :

df = pd.DataFrame({"name":["alex","bob","cathy"], "savings_2019A":[10,20,30], "savings_2020A":[40,50,60]})
df



   name  savings_2019A  savings_2020A
0  alex       10             40
1  bob        20             50
2  cathy      30             60

這裏,這個DataFrame和之前的DataFrame的區別在於每個列名都附加了一個"A"字符。

如果我們像上一個例子一樣調用wide_to_long(~),結果將為空:

pd.wide_to_long(df, ["savings_"], i="name", j="year")



              savings_2019A  savings_2020A  savings_
name	year

這是因為列名稱現在是 "2019A" 而不是數字 "2019" 。由於後綴的默認值僅允許數字 ( "\d+" ),因此列 "2019A" 不會取消透視。我們可以通過設置正則表達式 "\w+" 來解決此問題,它允許使用 "2019A" 等術語:

pd.wide_to_long(df, ["savings"], i="name", j="year", sep="_", suffix="\w+")



              savings
name   year	
alex   2019A    10
bob    2019A    20
cathy  2019A    30
alex   2020A    40
bob    2020A    50
cathy  2020A    60

作為旁注,您還可以使用正則表達式 suffix=".*A" 來匹配以 "A" 結尾的所有列標簽。

相關用法


注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas DataFrame | wide_to_long method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。