Python熊猫可以完成这些任务吗?
我有一个八年(2013-2020)的时间序列数据框架,有小时数据,每年有九个区域,每个区域下有两列(“Gen”、“Load”),如下所示:Python熊猫可以完成这些任务吗?,python,pandas,Python,Pandas,我有一个八年(2013-2020)的时间序列数据框架,有小时数据,每年有九个区域,每个区域下有两列(“Gen”、“Load”),如下所示: A ZONE B ZONE ... G ZONE H ZONE I ZONE date_time GEN LOAD GEN LOAD
A ZONE B ZONE ... G ZONE H ZONE I ZONE
date_time GEN LOAD GEN LOAD ... LOAD GEN LOAD GEN LOAD
2013-01-01 00:00:00 725.7 5,859.5 312.2 3,194.7 ... 77.1 706.0 227.1 495.0 861.9
2013-01-01 01:00:00 436.2 450.5 248.0 198.0 ... 865.5 240.7 107.9 640.5 767.3
2013-01-01 02:00:00 464.5 160.2 144.2 068.3 ... 738.7 044.7 32.7 509.3 700.4
2013-01-01 03:00:00 169.9 733.8 268.1 869.5 ... 671.7 649.4 951.3 626.8 652.1
2013-01-01 04:00:00 145.4 553.4 280.2 872.8 ... 761.5 561.0 912.9 552.1 637.3
... ... ... ... ... ... ... ... ... ... ... ...
2020-12-31 19:00:00 450.9 951.7 371.4 516.3 ... 461.7 808.9 471.4 983.7 447.8
2020-12-31 20:00:00 553.0 936.5 848.7 233.9 ... 397.3 978.3 404.3 490.9 233.0
2020-12-31 21:00:00 458.6 735.6 716.8 121.7 ... 385.1 808.0 192.0 131.5 70.1
2020-12-31 22:00:00 515.8 651.6 693.5 142.4 ... 291.4 826.1 16.8 591.9 863.2
2020-12-31 23:00:00 218.6 293.4 448.2 14.2 ... 340.6 435.0 897.4 622.5 768.3
我想要的是:
1-检测每列中的离群值,该离群值大于或小于三倍标准偏差
并将其放在一个新列中,其名称为“a_gen_outliers”(如果有)
“A区域”下“GEN”列中的异常值,以及“A\u负载\u异常值”(如果存在)
“A区域”下“加载”列中的异常值。新列数为18列
2-新列表示“Gen”列的总和
3-新列表示“加载”列的总和
4-新列表示“GEN”列计算A_GEN_div=单元值/每年分区下“GEN”列的最大值,例如,第一个单元为725.7/725.7=1,第二个单元为436.2/725.1,最后一个单元为218.6/553。等等,所有“GEN”列和“LOAD”列的值相同-建议名称为“A_LOAD_div”
新列数为18列
新列总数为“18*2+2”列
提前谢谢。我认为这可能会有所帮助。请注意,这将保留列
多索引
。您上面的观点似乎意味着您希望展平您的多索引
。如果是这样,您可能需要看看这个
1:
2和3:
df.groupby(level=-1, axis=1).sum()
请注意,MultIndex
列的第一级应该是什么并不清楚
4:
@gofvonx列的第一级是X Zone.df.join(df.divide(df.max()),rsuffix=''u div')根据列中所有值的最大值提供结果,但我希望每年的最大值来计算单元格值/每年的最大值。如上面提到的示例所示。@swhh抱歉-我已更新了我的答案。这是否有效?抱歉,迟到了-上一个代码运行良好,但如果有办法删除列名称以压缩其names@swhh您可以使用
pd.MultiIndex.set_levels
重命名列。例如,请参见以下问题:
df.groupby(level=-1, axis=1).sum()
maxima = df.resample('1Y').max()
maxima.index = maxima.index + pd.DateOffset(hours=23)
maxima = maxima.reindex(df.index, method='bfill')
df.join(df.divide(maxima), rsuffix='_div')