我有一个多索引列。高层是一些人,底层是一些措施。我想创建一些新的列,它们是度量的衍生物(例如滚动平均值)。我希望我可以使用一些索引切片来实现这一点,但可惜现在。我过去在这里发现了一些类似的问题,但它们是老问题,我怀疑有更现代的、Pythonic 的解决方案。
下面是一个玩具示例,其中我演示了我正在尝试对一列执行的操作(有效),但显示如果我尝试将其应用于所有子列分组,则相同的方法会失败。
index = pd.DatetimeIndex(start='2018-1-1',periods=5,freq="M")
persons = ['mike', 'dave', 'matt']
measures = ['spin', 'drag', 'bezel']
cols = pd.MultiIndex.from_product([persons, measures],names=['human', 'measure'])
xf = pd.DataFrame(index=index, data=np.random.rand(5,9), columns=cols)
idx = pd.IndexSlice
#Doing this to one specific column works
xf.loc[:,idx['mike','bezel']].rolling(window=2).mean()
xf.loc[:,idx['mike','roll']] = xf.loc[:,idx['mike','bezel']].rolling(window=2).mean()
#Trying to create a 'roll2' measure for all the humans (mike, dave,matt) doesn't work
xf.loc[:,idx[:,'roll2']] = "placeholder" #xf.loc[:,idx['mike','bezel']].rolling(window=2).mean()
xf
最佳答案
首先按 xs
选择列,应用滚动
并创建MultiIndex
,最后join
原文:
df = xf.xs('bezel', axis=1, level=1).rolling(window=2).mean()
df.columns = [df.columns, ['roll2'] * len(df.columns)]
另一个使用重命名
的解决方案:
df = (xf.xs('bezel', axis=1, level=1, drop_level=False).rolling(window=2).mean()
.rename(columns={'bezel':'roll2'}))
<小时/>
print (df)
human mike dave matt
roll2 roll2 roll2
2018-01-31 NaN NaN NaN
2018-02-28 0.439297 0.756530 0.407606
2018-03-31 0.432513 0.436660 0.430393
2018-04-30 0.258736 0.469610 0.850996
2018-05-31 0.278869 0.698822 0.561285
<小时/>
xf = xf.join(df)
print (xf)
human mike dave \
measure spin drag bezel spin drag bezel
2018-01-31 0.811030 0.114535 0.326579 0.597781 0.194064 0.659795
2018-02-28 0.774971 0.400888 0.552016 0.385539 0.582351 0.853266
2018-03-31 0.794427 0.653428 0.313010 0.996514 0.524999 0.020055
2018-04-30 0.307418 0.131451 0.204462 0.049346 0.198878 0.919165
2018-05-31 0.196374 0.421594 0.353276 0.244024 0.930992 0.478479
human matt mike dave \
measure spin drag bezel roll roll2 roll2
2018-01-31 0.769308 0.657963 0.691395 NaN NaN NaN
2018-02-28 0.564884 0.026864 0.123818 0.439297 0.439297 0.756530
2018-03-31 0.755440 0.698443 0.736967 0.432513 0.432513 0.436660
2018-04-30 0.782908 0.919064 0.965025 0.258736 0.258736 0.469610
2018-05-31 0.414085 0.339771 0.157545 0.278869 0.278869 0.698822
human matt
measure roll2
2018-01-31 NaN
2018-02-28 0.407606
2018-03-31 0.430393
2018-04-30 0.850996
2018-05-31 0.561285
最后如果需要排序MultiIndex
:
xf = xf.join(df).sort_index(axis=1)
关于python - 在多索引 pandas 列的子级别中创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54586812/