假设我有两个使用列表理解构建的列表a
和b
。它们的长度相等。例如:a = [1, 2, 3]
和b = ['a', 'b', 'c']
。
现在,我想要一个带有这些列表数据的pandas MultiIndex系列。 E.g:
2017-03-31 num 1
lab a
2017-04-30 num 2
lab b
2017-05-31 num 3
lab c
现在,我这样做如下:
from itertools import chain
daterange = pd.date_range('2017-03', '2017-06', freq='M')
index = pd.MultiIndex.from_product([daterange, ['num', 'lab']])
series = pd.Series(list(chain(*zip(a, b))), index=index)
这样做很好,但由于某种原因,它对我来说感觉“难看”。首先,我很失望我需要添加显式list
语句,因为pandas似乎将链对象解释为标量而不是迭代器,但我也不喜欢为此导入itertools。
那么,有更好的方法吗?谢谢!
答案 0 :(得分:1)
您可以将数据放在一起作为DataFrame,然后将unstack
放入一个系列中,该系列应该可以为您提供所需的形状:
daterange = pd.date_range('2017-03', '2017-06', freq='M')
df = pd.DataFrame([a,b], index=['num', 'lab'], columns=daterange)
这使得2x3数据帧:
print(df)
2017-03-31 2017-04-30 2017-05-31
num 1 2 3
lab a b c
series = df.unstack()
这会将DataFrame
改为Series
,并将MultiIndex
作为索引
print(series)
2017-03-31 num 1
lab a
2017-04-30 num 2
lab b
2017-05-31 num 3
lab c