pandas.PeriodIndex上的文档给出了以下构造示例:
>>> idx = PeriodIndex(year=year_arr, quarter=q_arr)
并指定这两个参数的类型:
年份:int、array或Series,默认为None
月:int、array或Series,默认为None
但是我在尝试使用这种类型的构造时遇到了类型错误。

import numpy as np
import pandas as pd

# (Year, Month) MultiIndex'd DataFrame
idx = pd.MultiIndex.from_product(([2017, 2016], range(1, 13)))
df = pd.DataFrame(np.random.randn(24, 2), index=idx, columns=['a', 'b'])

print(df.head())
               a         b
2017 1  0.406534 -0.516329
     2 -0.687286 -0.066606
     3  1.493217  0.539294
     4  2.069313  0.415216
     5 -0.212414 -1.375707

# Seems to mimic the construction example from the docs above:
pd.PeriodIndex(year=df.index.get_level_values(0),
               month=df.index.get_level_values(1))
# TypeError: expected string or bytes-like object

# Same issue even if I specify inputs as NumPy arrays or lists
pd.PeriodIndex(year=df.index.get_level_values(0).values,
               month=df.index.get_level_values(1).values)
pd.PeriodIndex(year=df.index.get_level_values(0).tolist(),
               month=df.index.get_level_values(1).tolist())

额外的问题:我能解开多重索引的层次吗?现在我有了
year, month = list(zip(*df.index.get_values()))

有没有规定的方法从指数的水平得到一个iterable?
工作地点:熊猫0.20.3。

最佳答案

您可以通过显式指定频率字符串并传入列表/元组来实现这一点:

In [10]: pd.PeriodIndex(year=df.index.get_level_values(0).tolist(),
    ...:                month=df.index.get_level_values(1).tolist(), freq='M')
    ...:
Out[10]:
PeriodIndex(['2017-01', '2017-02', '2017-03', '2017-04', '2017-05', '2017-06',
             '2017-07', '2017-08', '2017-09', '2017-10', '2017-11', '2017-12',
             '2016-01', '2016-02', '2016-03', '2016-04', '2016-05', '2016-06',
             '2016-07', '2016-08', '2016-09', '2016-10', '2016-11', '2016-12'],
            dtype='period[M]', freq='M')

或者用zip打开包装:
In [11]: pd.PeriodIndex(year,month=zip(*df.index.get_values()), freq='M')
Out[11]:
PeriodIndex(['2017-01', '2017-01', '2017-01', '2017-01', '2017-01', '2017-01',
             '2017-01', '2017-01', '2017-01', '2017-01', '2017-01', '2017-01',
             '2016-01', '2016-01', '2016-01', '2016-01', '2016-01', '2016-01',
             '2016-01', '2016-01', '2016-01', '2016-01', '2016-01', '2016-01'],
            dtype='period[M]', freq='M')

不知道为什么它不能使用Index或numpy数组。可能是虫子。

关于python - 从两个int64列构造PeriodIndex,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47289706/

10-08 22:15