Python中Pandas選取後幾列後幾行操作及同一列資料移位運算
阿新 • • 發佈:2019-02-01
首先說一下需求,有一組資料需要取出後幾列資料,並且將以一列資料進行移位運算,即(第二個資料-第一個資料)/第一個資料,(第三個資料-第二個資料)/第二個資料,以此類推。
以下為資料集的樣子,共3338行,1151列,我只要用到最後五列。
0 1 2 ... count 10 01 0 6525.32 6525.40 6525.40 ... 74 3864.0 624.0 1 6529.02 6529.02 6529.02 ... 32 876.0 6406.0 2 6526.32 6526.31 6526.32 ... 26 888.0 672.0 3 6530.00 6529.87 6529.15 ... 83 920.0 2488.0 4 6526.00 6526.00 6526.21 ... 37 12.0 11210.0 5 6523.76 6525.15 6524.42 ... 7 146.0 76.0 6 6536.50 6536.51 6536.50 ... 196 10162.0 12096.0 7 6548.21 6548.59 6548.59 ... 107 1624.0 12658.0 8 6550.20 6550.15 6550.20 ... 71 1320.0 2280.0 9 6550.34 6550.77 6550.77 ... 76 944.0 8982.0 ... ... ... ... ... ... ... ... 3329 6745.42 6745.41 6745.37 ... 58 1728.0 3350.0 3330 6752.83 6752.83 6753.88 ... 80 1304.0 9572.0 3331 6753.27 6755.89 6756.00 ... 50 510.0 3518.0 3332 6751.99 6751.85 6751.85 ... 39 1132.0 160.0 3333 6753.82 6753.82 6754.04 ... 106 6312.0 2688.0 3334 6767.75 6767.75 6767.75 ... 96 3386.0 2752.0 3335 6762.53 6762.11 6762.11 ... 74 742.0 9552.0 3336 6757.91 6757.61 6757.61 ... 57 3268.0 194.0 3337 6765.50 6765.00 6765.10 ... 26 1366.0 2760.0 [3338 rows x 1151 columns]
可以看到最後的兩三列我們是能看到並且知道列名的,那就可以直接用DataFrame['ColumnName']取出,但是其餘的就不方便了,然後DataFrame只有tail方法可以取到後幾行,但是隻能針對行運算,所以想到將這個資料集轉置,列變行,取最後幾行再進行轉置,最後把取到的資料按照要求取列名。
useframe = dataframe.T.copy()
useframe = useframe.tail(5).T #獲取要用到的最後五列
useframe.columns = ['data','time','count0','10','01']
之後是移位運算操作,Pandas裡是可以直接用DataFrame和Series進行運算的,但是要求index一致,所以我們針對一列的資料運算可以用兩個Series操作,流程如下:
首先看實現以及執行效果:
0 6529.02 1 6528.09 2 6531.18 3 6526.00 4 6522.80 5 6523.76 6 6546.69 7 6550.13 8 6550.13 9 6544.16 10 6541.89 11 6540.83 ... 3329 6744.97 3330 6755.99 3331 6750.80 3332 6755.98 3333 6766.76 3334 6763.46 3335 6750.00 3336 6763.83 3337 6760.00 Name: data, Length: 3338, dtype: float64 #這是要進行運算的資料
dividend = useframe['data'].copy()
divisor = useframe['data'].copy()
divisor = divisor.drop(0)
divisor = divisor.reset_index(drop = True) #除數處理
final = (divisor - dividend)/dividend
0 -0.000142
1 0.000473
2 -0.000793
3 -0.000490
4 0.000147
5 0.003515
6 0.000525
7 0.000000
8 -0.000911
9 -0.000347
10 -0.000162
11 -0.000604
...
3329 0.001634
3330 -0.000768
3331 0.000767
3332 0.001596
3333 -0.000488
3334 -0.001990
3335 0.002049
3336 -0.000566
3337 NaN
Name: data, Length: 3338, dtype: float64 #這是運算後的結果
可以看到運算後的結果為NaN,這是因為上圖中右邊列在drop()第一行後是隻有3337行的,所以在和3338行的左邊列運算時最後3338行是缺失的。另外要注意在drop()過後要reset_index(),原因是之前所說的Series之間操作是以index為依據,只drop()是不改變他們的index的。
之後是要刪除掉最後一行:
final = final.drop(final.size-1)
#Series裡不能直接用drop(-1)刪除
useframe = useframe.drop(0)
useframe = useframe.reset_index(drop = True)
useframe['Calculation'] = final
最終結果如下:
data time count0 10 01 Calculation
0 6528.09 25511176.0 32.0 876.0 6406.0 -0.000142
1 6531.18 25511177.0 26.0 888.0 672.0 0.000473
2 6526.00 25511216.0 83.0 920.0 2488.0 -0.000793
3 6522.80 25511217.0 37.0 12.0 11210.0 -0.000490
4 6523.76 25511218.0 7.0 146.0 76.0 0.000147
5 6546.69 25511243.0 196.0 10162.0 12096.0 0.003515
6 6550.13 25511244.0 107.0 1624.0 12658.0 0.000525
7 6550.13 25511245.0 71.0 1320.0 2280.0 0.000000
8 6544.16 25511246.0 76.0 944.0 8982.0 -0.000911
9 6541.89 25511247.0 73.0 2160.0 4278.0 -0.000347
10 6540.83 25511248.0 22.0 1058.0 320.0 -0.000162
... ... ... ... ... ... ...
3327 6746.69 25529873.0 21.0 1564.0 224.0 0.000805
3328 6744.97 25529874.0 58.0 1728.0 3350.0 -0.000255
3329 6755.99 25529884.0 80.0 1304.0 9572.0 0.001634
3330 6750.80 25529885.0 50.0 510.0 3518.0 -0.000768
3331 6755.98 25529886.0 39.0 1132.0 160.0 0.000767
3332 6766.76 25529978.0 106.0 6312.0 2688.0 0.001596
3333 6763.46 25529979.0 96.0 3386.0 2752.0 -0.000488
3334 6750.00 25529980.0 74.0 742.0 9552.0 -0.001990
3335 6763.83 25529981.0 57.0 3268.0 194.0 0.002049
3336 6760.00 25529982.0 26.0 1366.0 2760.0 -0.000566
[3337 rows x 6 columns]