Python 具有多个标头的timeseries数据帧

Python 具有多个标头的timeseries数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试创建一个带有多个列标题的timeseries数据的数据帧,但我对python和pandas还不熟悉。数据框架是一天的每小时数据下降和100万个服务点。我可以使用以下内容创建基本数据帧: intdata = pd.DataFrame(np.random.randint(0,1000,size=(24, 1000000)), index=pd.date_range('2018-01-01',periods=24, freq='H')) Index

我正在尝试创建一个带有多个列标题的timeseries数据的数据帧,但我对python和pandas还不熟悉。数据框架是一天的每小时数据下降和100万个服务点。我可以使用以下内容创建基本数据帧:

intdata = pd.DataFrame(np.random.randint(0,1000,size=(24, 1000000)),
                   index=pd.date_range('2018-01-01',periods=24, freq='H'))

Index                 0   1   2   3   4   5   6   7 ... 1000000
2018-01-01 00:00:00 458 352 905 176 801 438 193 172         123
2018-01-01 01:00:00 68  313 465 460 960 487 574 335         123
2018-01-01 02:00:00 769 984 253 143 592 741 709 660         123
2018-01-01 03:00:00 316 684 195 660 602 200 228 748         123
2018-01-01 04:00:00 201 947 514 696 12  288 577 957         123
2018-01-01 05:00:00 235 118 746 880 909 365 233  57         123
...
我希望索引行后面是每个点的一组特征,如:

Service Point         0   1   2   3   4   5   6   7 **** my index
Characteristic_1      A   A   C   B   A   D   B   C **** characteristics needed
Characteristic_2      X   Y   Y   Z   Z   J   Q   J
2018-01-01 00:00:00 458 352 905 176 801 438 193 172
2018-01-01 01:00:00 68  313 465 460 960 487 574 335
...
我该怎么做

谢谢

pandas.MultiIndex.from\u tuples
您需要指定级别

tups = [(0, 'A', 'X'), (1, 'A', 'Y'), (2, 'C', 'Y'), (3, 'B', 'Z')]
mcol = pd.MultiIndex.from_tuples(
    tups, names=['Service Point', 'Characteristic_1', 'Characteristic_2'])
然后将这些与数据帧的规范一起包含

intdata = pd.DataFrame(
    np.random.randint(0,1000,size=(10, 4)),
    index=pd.date_range('2018-01-01',periods=10, freq='H'),
    columns=mcol
)

intdata

Service Point          0    1    2    3
Characteristic_1       A    A    C    B
Characteristic_2       X    Y    Y    Z
2018-01-01 00:00:00  400  800  426  433
2018-01-01 01:00:00  920  123  250  113
2018-01-01 02:00:00  319  300  187   33
2018-01-01 03:00:00  673  230  696  472
2018-01-01 04:00:00  703  766  962  796
2018-01-01 05:00:00  322  295  414  734
2018-01-01 06:00:00  987   38  400  848
2018-01-01 07:00:00  350  275  494  833
2018-01-01 08:00:00  677   58  335  293
2018-01-01 09:00:00  284  195  742  355

如果现有列表中有级别,可以使用
zip

chr1 = [*'AACBADBC']
chr2 = [*'XYYZZJQJ']
tups = [*zip(range(8), chr1, chr2)]

mcol = pd.MultiIndex.from_tuples(
    tups, names=['Service Point', 'Characteristic_1', 'Characteristic_2'])
tidx = pd.date_range('2018-01-01',periods=10, freq='H')
data = np.random.randint(0, 1000, size=(len(tidx), len(mcol)))

intdata = pd.DataFrame(data, tidx, mcol)

intdata

Service Point          0    1    2    3    4    5    6    7
Characteristic_1       A    A    C    B    A    D    B    C
Characteristic_2       X    Y    Y    Z    Z    J    Q    J
2018-01-01 00:00:00  311  306  868   48  894  584  989  548
2018-01-01 01:00:00  848  170  592  640  638  400  112  642
2018-01-01 02:00:00  906  660  883  149  907  848  247  875
2018-01-01 03:00:00  461  432  479  733  979  540  311   86
2018-01-01 04:00:00  849  471  480  836  834  235  901   22
2018-01-01 05:00:00  758  193   45  405  739  818   81  577
2018-01-01 06:00:00  752  647  799  688  588  496   37  504
2018-01-01 07:00:00  380  785  750  975  960  535  971  257
2018-01-01 08:00:00  187  422  915  863  290  483  423  473
2018-01-01 09:00:00  270  144  749  710  983  755  839  709

pandas.MultiIndex.from_数组
但是,如果您已经在单独的列表中列出了这些级别,您不需要自己
zip

chr1 = [*'AACBADBC']
chr2 = [*'XYYZZJQJ']

mcol = pd.MultiIndex.from_arrays(
    [range(8), chr1, chr2],
    names=['Service Point', 'Characteristic_1', 'Characteristic_2'])

tidx = pd.date_range('2018-01-01',periods=10, freq='H')

data = np.random.randint(0, 1000, size=(len(tidx), len(mcol)))

intdata = pd.DataFrame(data, tidx, mcol)

intdata

Service Point          0    1    2    3    4    5    6    7
Characteristic_1       A    A    C    B    A    D    B    C
Characteristic_2       X    Y    Y    Z    Z    J    Q    J
2018-01-01 00:00:00  311  306  868   48  894  584  989  548
2018-01-01 01:00:00  848  170  592  640  638  400  112  642
2018-01-01 02:00:00  906  660  883  149  907  848  247  875
2018-01-01 03:00:00  461  432  479  733  979  540  311   86
2018-01-01 04:00:00  849  471  480  836  834  235  901   22
2018-01-01 05:00:00  758  193   45  405  739  818   81  577
2018-01-01 06:00:00  752  647  799  688  588  496   37  504
2018-01-01 07:00:00  380  785  750  975  960  535  971  257
2018-01-01 08:00:00  187  422  915  863  290  483  423  473
2018-01-01 09:00:00  270  144  749  710  983  755  839  709