我正在尝试使用pandas构建如下所示的数据框架,其中Asum仅在当天存在间隔1和3时才获取值。我最接近的东西正在使用此:

 df['ASum']=df.groupby(level=['DateTime'])['A'].sum()


但是,当我运行它时,它会一直沿ASum返回NaN。任何有关如何做到这一点的想法表示赞赏。

                     A         B      ASum
DateTime   INT
2016-07-05 3      4700.0     4700.0   0
2016-07-06 1      5906.0     6830.0   0
           3      1090.0     1090.0   6996
2016-07-07 1      7969.0     5273.0   0
           3      1971.0     1971.0   9940
2016-07-08 1      3296.0     2764.0   0
           3      1179.0     1179.0   4475
2016-07-11 1      4993.0     5798.0   0
           3      1325.0     1325.0   6318

最佳答案

这是一个基于拆解INT级别,获取总和并将其堆叠回来的解决方案。

import pandas as pd

midx = pd.MultiIndex(levels=[['2016-07-05', '2016-07-06', '2016-07-07',
                              '2016-07-08', '2016-07-11'], [1, 3]],
                     labels=[[0, 1, 1, 2, 2, 3, 3, 4, 4],
                             [1, 0, 1, 0, 1, 0, 1, 0, 1]],
                     names=['DateTime', 'INT'])
df = pd.DataFrame({'A': [4700.0, 5906.0, 1090.0, 7969.0, 1971.0,
                         3296.0, 1179.0, 4993.0, 1325.0],
                   'B': [4700.0, 6830.0, 1090.0, 5273.0, 1971.0,
                         2764.0, 1179.0, 5798.0, 1325.0]},
                 index=midx)

df = df.unstack(level='INT')
df[('Asum', 3)] = df['A'].sum(axis=1, skipna=False)
df = df.stack(level='INT').fillna(0)
print(df)


输出:

                     A       B    Asum
DateTime   INT
2016-07-05 3    4700.0  4700.0     0.0
2016-07-06 1    5906.0  6830.0     0.0
           3    1090.0  1090.0  6996.0
2016-07-07 1    7969.0  5273.0     0.0
           3    1971.0  1971.0  9940.0
2016-07-08 1    3296.0  2764.0     0.0
           3    1179.0  1179.0  4475.0
2016-07-11 1    4993.0  5798.0     0.0
           3    1325.0  1325.0  6318.0

关于python - 带多个索引的分组依据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38725456/

10-12 16:59