1. 程式人生 > >Python中Pandas選取後幾列後幾行操作及同一列資料移位運算

Python中Pandas選取後幾列後幾行操作及同一列資料移位運算

首先說一下需求,有一組資料需要取出後幾列資料,並且將以一列資料進行移位運算,即(第二個資料-第一個資料)/第一個資料,(第三個資料-第二個資料)/第二個資料,以此類推。

以下為資料集的樣子,共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]