修复 DataFrame 的坐标排序?

Fix the coordinates ordering of a DataFrame?

我正在尝试制作一个 DataFrame 来存储从测量测试中获取的多个数据集。 数据有 8 个维度 (dims) 来指定测试条件。 {'Machine','Year','Month','Compensation','Axis','SensorID','Pos(ition)'}.

当我从测试中制作一个DataFrame时,我发现维度是按字母顺序排列的,即: {'Axis','Compensation','Machine','Month','Pos','SensorID','Year'}.

所以输出如下图所示。

为了便于理解数据,我想保留维度的初始排序 {'Machine','Year','Month','Compensation','Axis','SensorID','Pos'}.

有没有办法保留维度的初始顺序? 或者有没有更好的方法来处理这种高维数据?

Python代码如下所示。 例如,我从不同的机器上获取了 3 个数据,即 'MC_A'、'MC_B' 和 'MC_C'。 数据分别存储在 DataArray 'da'、'da2' 和 'da3' 中。 为了创建一个 DataFrame 来存储它们,我使用了 'merge' 方法。

import xarray as xr
import numpy as np
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px

x = np.linspace(0,1500,16)
y = np.random.random((1,1,1,1,1,6,len(x)))
y2 = np.random.random((1,1,1,1,1,6,len(x)))
y3 = np.random.random((1,1,1,1,1,6,len(x)))

da = xr.DataArray(y, dims=('Machine','Year','Month','Compensation','Axis','SensorID','Pos'),
                    coords={'Machine':['MC_A'],'Year':['2020'],'Month':['Aug'],'Compensation':[1],
                            'Axis':['X'],'SensorID':range(6),'Pos':x},
                    name='val')

da2 = xr.DataArray(y2, dims=('Machine','Year','Month','Compensation','Axis','SensorID','Pos'),
                    coords={'Machine':['MC_B'],'Year':['2020'],'Month':['Aug'],'Compensation':[1],
                            'Axis':['X'],'SensorID':range(6),'Pos':x},
                    name='val')

da3 = xr.DataArray(y3, dims=('Machine','Year','Month','Compensation','Axis','SensorID','Pos'),
                    coords={'Machine':['MC_C'],'Year':['2020'],'Month':['Aug'],'Compensation':[1],
                            'Axis':['X'],'SensorID':range(6),'Pos':x},
                    name='val')

ds = xr.merge([da,da2,da3])
# print(da)
df = ds.to_dataframe()
# df.reorder_levels(['Machine','Year','Month','Compensation','Axis','Errors','Pos'])

df

1 - 您真的需要使用 XArray 吗?在你给出的例子中,你可以直接实例化DataFrames,然后连接它们。

da = pd.DataFrame({'Machine':['MC_A'],'Year':['2020'],
                   'Month': 'Aug'],'Compensation':[1], 
                   'Axis':['X'],'SensorID':range(6),'Pos':x})
...
ds = pd.concat([da, da1, da2])

2 - 如果这样做,您可以合并数据框而不是

df = pd.concat([da.to_dataframe(), da2.to_dataframe(), da3.to_dataframe()])

请注意,pandas < 1.0 用于默认对列进行排序,因此您必须将 sort=False 传递给 concat