首先说一下需求,有一组数据需要取出后几列数据,并且将以一列数据进行移位运算,即(第二个数据-第一个数据)/第一个数据,(第三个数据-第二个数据)/第二个数据,以此类推。

以下为数据集的样子,共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]
 

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:[email protected]
QQ群:637538335
关注微信