Pandas timeseries带有多个标头的数据帧

问题描述 投票:3回答:1

我正在尝试使用具有多个列标题的时间序列数据创建数据帧,但我是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
...

我怎么做?

谢谢

python pandas dataframe
1个回答
4
投票

pandas.MultiIndex.from_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'])

然后将这些包含在DataFrame的规范中

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_arrays

但话说回来,如果你已经在单独的列表中的级别,你不需要自己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
© www.soinside.com 2019 - 2024. All rights reserved.