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 的操作。在這個例子中,我們是不旋轉變量age
和height
.
參數
1. df
| DataFrame
輸入數據幀。
2. stubnames
| string
或 list-like
將拉長的列標簽的前綴。
3. i
| string
或 list-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"
結尾的所有列標簽。
相關用法
- Python PySpark DataFrame withColumnRenamed方法用法及代碼示例
- Python PySpark DataFrame withColumn方法用法及代碼示例
- Python PySpark DataFrame where方法用法及代碼示例
- Python Pandas DataFrame where方法用法及代碼示例
- Python Pandas DataFrame empty屬性用法及代碼示例
- Python Pandas DataFrame pop方法用法及代碼示例
- Python Pandas DataFrame nsmallest方法用法及代碼示例
- Python Pandas DataFrame sample方法用法及代碼示例
- Python Pandas DataFrame items方法用法及代碼示例
- Python Pandas DataFrame max方法用法及代碼示例
- Python Pandas DataFrame swaplevel方法用法及代碼示例
- Python Pandas DataFrame agg方法用法及代碼示例
- Python Pandas DataFrame copy方法用法及代碼示例
- Python Pandas DataFrame pow方法用法及代碼示例
- Python Pandas DataFrame insert方法用法及代碼示例
- Python Pandas DataFrame lt方法用法及代碼示例
- Python Pandas DataFrame all方法用法及代碼示例
- Python Pandas DataFrame unstack方法用法及代碼示例
- Python Pandas DataFrame mean方法用法及代碼示例
- Python PySpark DataFrame filter方法用法及代碼示例
- Python Pandas DataFrame tz_convert方法用法及代碼示例
- Python Pandas DataFrame isin方法用法及代碼示例
- Python PySpark DataFrame collect方法用法及代碼示例
- Python PySpark DataFrame intersect方法用法及代碼示例
- Python PySpark DataFrame dtypes屬性用法及代碼示例
注:本文由純淨天空篩選整理自Isshin Inada大神的英文原創作品 Pandas DataFrame | wide_to_long method。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。