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操作,流程如下:

Python中Pandas选取后几列后几行操作及同一列数据移位运算_第1张图片

 首先看实现以及运行效果:

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]

 

你可能感兴趣的:(Python,python,pandas,series)