Pandas 0.19.2中多索引Series重排为列联表的实现方法
解决多级索引Series转列联DataFrame的问题
嘿,你完全不用纠结groupby()啦,Pandas里有个专门的方法刚好匹配你的需求——unstack(),它就是用来把多级索引中的某一级“展开”成列的,完美解决你的转换需求!
直接实现的代码
你只需要在创建好的Series s 上调用unstack(),指定要展开的索引级别(这里是second)就行:
import pandas as pd import numpy as np # 你的原始代码,创建多级索引Series arrays = [[2001, 2001, 2002, 2002, 2002, 2003, 2004, 2004], ['A', 'B', 'A', 'C', 'D', 'B', 'C', 'D']] tuples = list(zip(*arrays)) index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second']) s = pd.Series(np.random.randn(8), index=index, name='signal') # 关键转换步骤 result = s.unstack(level='second') print(result)
输出结果
运行后你会得到和你目标格式完全一致的DataFrame:
A B C D first 2001 -2.48 0.95 NaN NaN 2002 0.55 NaN 0.65 -1.32 2003 NaN -0.25 NaN NaN 2004 NaN NaN 0.86 -0.31
为什么不用groupby()?
你之前尝试的groupby(level=1)是按second(也就是A/B/C/D)来分组,得到的是每个分组的聚合结果,而不是把索引转成列的结构,所以不符合你的需求。unstack()才是专门处理多级索引行列转换的工具。
额外小提示
如果你的数据中存在first和second的重复组合(比如同一个年份下同一个字母有多个值),可以通过aggfunc参数指定聚合方式,比如取平均值:
result = s.unstack('second', aggfunc='mean')
内容的提问来源于stack exchange,提问作者Zhubarb
相关产品推荐
相关产品推荐

