在數據處理與數據分析的過程中,我們經常會遇到一種處理場景就是行列轉換。目前,市場上的軟體比如SPSS,有相應的菜單進行操作。但是,SPSS有其自身的局限性,比如數據量大情況的性能劣勢。
Python作為一門開源的程式語言,在這方面就遠勝於SPSS。或許這樣的比較不是很恰當,我們就當是用來理解差異性的一種方式。
接下來,小編會帶領大家,基於python的使用numpy的一些方法,輕鬆進行數據處理與分析過程中經常遇到的行列轉換問題。
有許多用於重新排列表格型數據的基礎運算。這些函數也稱作重塑(reshape)或軸向旋轉(pivot)運算。
塑層次化索引
層次化索引為DataFrame數據的重排任務提供了一種具有良好一致性的方式。主要功能有二:
stack:將數據的列「旋轉」為行。
unstack:將數據的行「旋轉」為列。
In [9]: import numpy as np
In [10]: data=DataFrame(np.arange(6).reshape((2,3)),
index=pd.Index(['Ohio','Colorado'],name='state'),
columns=pd.Index(['one','two','three'],name='number'))
In [11]: data
Out[11]:
number one two three
state
Ohio 0 1 2
Colorado 3 4 5
使用stack()方法進行列轉行
使用該數據的stack方法即可將列轉換為行,得到一個Series:
In [12]: result=data.stack()
In [13]: result
Out[13]:
state number
Ohio one 0
two 1
three 2
Colorado one 3
two 4
three 5
dtype: int64
使用unstack()方法進行行轉列
對於一個層次化索引的Series,可以用unstack將其重排為一個DataFrame:
In [14]: result.unstack()
Out[14]:
number one two three
state
Ohio 0 1 2
Colorado 3 4 5
默認情況下,unstack操作的是最內層(stack也是如此)。傳入分層級別的編號或名稱即可對其他級別進行unstack操作:
In [15]: result.unstack(0)
Out[15]:
state Ohio Colorado
number
one 0 3
two 1 4
three 2 5
unstack操作引入缺失數據
如果不是所有的級別值都能在各分組中找到的話,則unstack操作可能會引入缺失數據:
In [17]: s1=Series([0,1,2,3],index=['a','b','c','d'])
In [18]: s2=Series([4,5,6],index=['c','d','e'])
In [19]: data2=pd.concat([s1,s2],keys=['one','two'])
In [20]: data2
Out[20]:
one a 0
b 1
c 2
d 3
two c 4
d 5
e 6
dtype: int64
In [21]: data2.unstack()
Out[21]:
a b c d e
one 0.0 1.0 2.0 3.0 NaN
two NaN NaN 4.0 5.0 6.0
stack默認濾除缺失數據
Stack默認會濾除缺失數據,因此該運算是可逆的:
In [22]: data2.unstack().stack()
Out[22]:
one a 0.0
b 1.0
c 2.0
d 3.0
two c 4.0
d 5.0
e 6.0
dtype: float64
In [23]: data2.unstack().stack(dropna=False)
Out[23]:
one a 0.0
b 1.0
c 2.0
d 3.0
e NaN
two a NaN
b NaN
c 4.0
d 5.0
e 6.0
dtype: float64
總的來說,通過python可以通過兩行代碼,輕鬆搞定行列轉換問題。依照上述內容,親手實踐一下吧,如有問題,歡迎留言與關注。感謝支持!