首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pandas: reindex multiindex,广播结果

Pandas: reindex multiindex,广播结果
EN

Stack Overflow用户
提问于 2013-04-10 03:45:39
回答 1查看 1.5K关注 0票数 1

我有一个多索引数据框架,其中包含不同地区、大小和日期的销售数据。我想要按大小计算每个日期的“全球”(所有地区)销售额总和,然后将其分配到原始数据帧中的一列,每个全球范围的销售额值和大小广播到每个地区。我认为我可以按大小和日期分组,然后使用cumsum(),然后获取答案并将其重新索引到原始数据帧,但这似乎不起作用。

下面是设置代码:

代码语言:javascript
复制
import pandas as pd
#Create the dataframe 'df'
regions=['NorthAm']*9
regions.extend(['APAC']*9)
regions.extend(['Eur']*9)
sizes=[12]*3
sizes.extend([14]*3)
sizes.extend([16]*3)
sizes=sizes*3
dates=['1/1/2011','1/2/2011','1/3/2011']*27
idx=zip(regions,sizes,dates)
idx=pd.MultiIndex.from_tuples(idx, names=['Region','Size','Date'])
df=pd.DataFrame(np.arange(27), index = idx, columns=['Sales']) 

# Check it
df

Out[1]: 
                       Sales
Region  Size Date           
NorthAm 12   1/1/2011      0
             1/2/2011      1
             1/3/2011      2
        14   1/1/2011      3
             1/2/2011      4
             1/3/2011      5
        16   1/1/2011      6
             1/2/2011      7
             1/3/2011      8
APAC    12   1/1/2011      9
             1/2/2011     10
             1/3/2011     11
        14   1/1/2011     12
             1/2/2011     13
             1/3/2011     14
        16   1/1/2011     15
             1/2/2011     16
             1/3/2011     17
Eur     12   1/1/2011     18
             1/2/2011     19
             1/3/2011     20
        14   1/1/2011     21
             1/2/2011     22
             1/3/2011     23
        16   1/1/2011     24
             1/2/2011     25
             1/3/2011     26

# Yes, that's right. Now create the cumulative sum, regardless of region
cs=df.groupby(level=['Size','Date']).sum().groupby(level=0).cumsum()

# Check it.
cs

Out[1]: 
               Sales
Size Date           
12   1/1/2011     27
     1/2/2011     57
     1/3/2011     90
14   1/1/2011     36
     1/2/2011     75
     1/3/2011    117
16   1/1/2011     45
     1/2/2011     93
     1/3/2011    144

现在我想做一些类似的事情:

代码语言:javascript
复制
df['WWSales']=cd.reindex(df, method='???')

要获得类似如下的内容:

代码语言:javascript
复制
Out[2]:
                       Sales    WWSales
Region  Size Date           
NorthAm 12   1/1/2011      0    27
             1/2/2011      1    57
             1/3/2011      2    90
        14   1/1/2011      3    36
             1/2/2011      4    75
             1/3/2011      5   115
        16   1/1/2011      6    45
             1/2/2011      7    93
             1/3/2011      8   144
APAC    12   1/1/2011      9    27
             1/2/2011     10    57
             1/3/2011     11    90
        14   1/1/2011     12    36
             1/2/2011     13    75
             1/3/2011     14   115
        16   1/1/2011     15    45
             1/2/2011     16    93
             1/3/2011     17   144
Eur     12   1/1/2011     18    27
             1/2/2011     19    57
             1/3/2011     20    90
        14   1/1/2011     21    36
             1/2/2011     22    75
             1/3/2011     23   115
        16   1/1/2011     24    45
             1/2/2011     25    93
             1/3/2011     26   144

我怀疑有一些非常明显的解决方案,但我没有看到它(也没有在搜索中找到它)。任何帮助都将不胜感激。

顺便说一句,bonus提供了一种将日期列转换为DateTimeIndex的优雅方法。下面是一些作品,但看起来并不优雅:

代码语言:javascript
复制
df.index.levels[2]=pd.tseries.period.DatetimeIndex(df.index.levels[2])
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-10 04:11:32

在每个组上使用transform方法,而不是(隐式地)应用sumcumsum。这就是:

代码语言:javascript
复制
df['WWSales'] = df.groupby(level=['Size','Date']).transform(np.sum).groupby(level=0).transform(np.cumsum)

这就给出了你想要的输出。

请参阅http://pandas.pydata.org/pandas-docs/dev/groupby.html#transformation

我将回答您的奖励问题:您可以将Timestamp映射到您的列表中。

代码语言:javascript
复制
 dates = map(pd.Timestamp, ['1/1/2011','1/2/2011','1/3/2011']*27)

但我希望有一种更好的方法--我把这个问题让给更有经验的声音……

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15911113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档