在 pandas 中,我想要一个数据框,其中某些列具有多索引,有些则没有。
在视觉上我想要这样的东西:
| c | |
|--------| d |
| a | b | |
================|
| 1 | 4 | 0 |
| 2 | 5 | 1 |
| 3 | 6 | 2 |
在 pandas 中我可以做这样的事情:
df = pd.DataFrame({'a':[1,2,3],'b':[4,5,6], 'd':[0,1,2]})
columns=[('c','a'),('c','b'), 'd']
df.columns=pd.MultiIndex.from_tuples(columns)
输出将是:
c d
a b NaN
0 1 4 0
1 2 5 1
2 3 6 2
但是,当通过
d
访问 df['d']
列时,我得到的输出是 Pandas Dataframe,而不是 Pandas 系列。问题显然是 pandas 对每一列应用了多列索引。所以我的问题是:有没有办法仅将列多重索引应用于某些列,而让其他列保持原样?
换句话说,我希望
df['d']
的结果是普通数据框中的 Series,df['c']
的结果是列多索引中的 pd.DataFrame 以及 df['c']['a']
Pandas Series 的结果。这可能吗?
你应该像这样定义一个单例
(d,)
:
import pandas as pd
df = pd.DataFrame({'a':[1,2,3],'b':[4,5,6], 'd':[0,1,2]})
columns=[('c','a'),('c','b'), ('d',)]
df.columns=pd.MultiIndex.from_tuples(columns)
print(df)
c d
a b NaN
0 1 4 0
1 2 5 1
2 3 6 2
由于标题的原因,df['d']
被视为数据帧而不是序列。通常,系列具有索引+值。
就像数据框是一个 2 级多索引列一样,您只需调用
NaN
即可获得子级别 df['d']
。
如果你想调用该系列,你必须调用
df[('d', np.nan)]
,这样你就不再有标题了。
>>> type(df['d'])
<class 'pandas.core.frame.DataFrame'>
>>> type(df[('d', np.nan)])
<class 'pandas.core.series.Series'>