我有一个数据框,其编入索引status
,date
。大多数变量都适用于status
和date
,但superDuper
仅适用于date
,每个状态都相同:
t070199 t070299 t070201 t070105 superDuper
date status
2003-01-01 foo 0.137684 0.032750 1.729324 4.484633 481.329224
fubar 1.348261 0.000000 0.159443 0.636001 481.329224
2005-01-01 foo 0.038752 0.006538 1.341507 3.518619 474.549400
fubar 0.000000 0.000000 0.000000 8.457774 474.549400
2007-01-01 foo 0.000000 0.097280 3.639593 1.901233 459.767016
如果我df.unstack(level='status')
,我会得到一些
t070199 t070299 superDuper t070105 \
status foo fubar foo fubar foo fubar emp
date
2003-01-01 0.137684 1.348261 0.032750 0 1.729324 1.729324 4.484633
2005-01-01 0.038752 0.000000 0.006538 0 1.341507 1.341507 3.518619
2007-01-01 0.000000 0.000000 0.097280 0 3.639593 3.639593 1.901233
2009-01-01 0.010630 0.000000 0.000000 0 1.840457 1.840457 2.728080
2011-01-01 0.013474 0.000000 0.000000 0 2.020553 1.739148 1.320693
也就是说,第一个级别包含txxxx
,superDuper
列,对于每个列,我们有两列的子列。
我想重塑数据,以便我有以下第一级列:
[`t070199`, `t070299`, `t070201`, `t070105`]
对于每个顶级列,我想有3个子列:
['foo', 'bar', 'superDuper']
然后作为索引,只有date
。由于superDuper
并非特定于txxxx
列,因此这可能意味着重复该列。 pivot
并没有让我到那里,因为它不是一个子图层,unstack()
可能也没有做到这一点。我可以尝试什么方法?
答案 0 :(得分:3)
让我们从您的数据框开始:
t070199 t070299 t070201 t070105 superDuper
date status
2003-01-01 foo 0.137684 0.032750 1.729324 4.484633 481.329224
bar 1.348261 0.000000 0.159443 0.636001 481.329224
2005-01-01 foo 0.038752 0.006538 1.341507 3.518619 474.549400
bar 0.000000 0.000000 0.000000 8.457774 474.549400
2007-01-01 foo 0.000000 0.097280 3.639593 1.901233 459.767016
弹出superDuper
并保存以供日后使用。现在你可以使用unstack了。
>>> sd = df.pop("superDuper")
>>> df = df.unstack()
t070199 t070299 t070201 \
status bar foo bar foo bar foo
date
2003-01-01 1.348261 0.137684 0.000000 0.032750 0.159443 1.729324
2005-01-01 0.000000 0.038752 0.000000 0.006538 0.000000 1.341507
2007-01-01 NaN 0.000000 NaN 0.097280 NaN 3.639593
t070105
status bar foo
date
2003-01-01 0.636001 4.484633
2005-01-01 8.457774 3.518619
2007-01-01 NaN 1.901233
获取唯一的superDuper
值:
>>> sd = sd.reset_index(level="status", drop=True).drop_duplicates()
date
2003-01-01 481.329224
2005-01-01 474.549400
2007-01-01 459.767016
Name: superDuper, dtype: object
现在,我将假设您想要每个txxxx的superDuper
子列。你的问题并不是很清楚这是真的还是你刚刚辞职。
您可以使用dict理解来获取新列。
>>> new = pd.DataFrame({(col, sd.name): sd for col in
df.columns.get_level_values(0)})
t070105 t070199 t070201 t070299
superDuper superDuper superDuper superDuper
date
2003-01-01 481.329224 481.329224 481.329224 481.329224
2005-01-01 474.549400 474.549400 474.549400 474.549400
2007-01-01 459.767016 459.767016 459.767016 459.767016
现在只需加入并排序:
>>>df.join(new).sort(axis=1)
t070105 t070199 \
status bar foo superDuper bar foo superDuper
date
2003-01-01 0.636001 4.484633 481.329224 1.348261 0.137684 481.329224
2005-01-01 8.457774 3.518619 474.549400 0.000000 0.038752 474.549400
2007-01-01 NaN 1.901233 459.767016 NaN 0.000000 459.767016
t070201 t070299
status bar foo superDuper bar foo superDuper
date
2003-01-01 0.159443 1.729324 481.329224 0.000000 0.032750 481.329224
2005-01-01 0.000000 1.341507 474.549400 0.000000 0.006538 474.549400
2007-01-01 NaN 3.639593 459.767016 NaN 0.097280 459.767016