【问题标题】:Groupby function for cumsum and reset it indexcumsum 的 Groupby 函数并重置它的索引
【发布时间】:2019-01-17 06:43:11
【问题描述】:

我的条件很简单:

如果当月总和 // 100:

打印总和并重置总和索引

其他:

继续加油

这是我的数据:

data = dict(
    Year=['2018', '2018', '2018', '2018', '2018', '2017', '2017', '2017'],
    Month=['08', '08', '04', '05', '05', '06', '02', '01'],
    Money=[26, 50, 25, 45, 20, 36, 84, 24]
)

这是我的尝试:

df = pd.DataFrame(data)
df = df.groupby(['Year', 'Month']).sum()
df['cum_y'] = df.groupby(['Year']).Money.cumsum() 


df['cum_m'] = df.groupby([lambda x: x // 100], level=0).Money.cumsum()

df['cum_m'] = df.groupby(lambda x: [x if x // 100 else None]).Money.cumsum()

df['cum_m'] = df.groupby(['Money']).agg(lambda x: x // 100).cumsum()

我想要这样的东西:

            Money  cum_y  cum_m (Payout actually)
Year Month
2017 01        24    24     x    (means None)
     02        84   108    108 - reset cumsum counter()
     06        36   144     x    (36)
2018 04        25    25     x    (61)
     05        65    90    126 - reset cumsum counter()
     08        76   166     x    (76)

【问题讨论】:

  • @jezrael 已更新!

标签: python pandas dataframe cumsum


【解决方案1】:

我知道应该尽可能避免迭代,但这里有一个使用迭代的解决方案:

total = 0
Cumsum = []
for item in df.Money:
    total += item
    if total < 100:
        Cumsum.append(np.nan)
    else:
        Cumsum.append(total)
        total = 0

df['Cumsum'] = Cumsum

输出:

               Money    Cumsum
Year    Month       
2017    01     24       NaN
        02     84       108.0
        06     36       NaN
2018    04     25       NaN
        05     65       126.0
        08     76       NaN

【讨论】:

  • 那么好的旧普通 python 是唯一的解决方案吗?我正在考虑更多熊猫的解决方法,嗯〜_〜但无论如何谢谢!
  • 根据this article (第四个答案) - DataFrame 元素中的普通循环比专用函数更有效(214 倍大声笑) iterrows 甚至 itertuples 之类的迭代!所以我绝对不同意你的解决方案,再次感谢! =)
猜你喜欢
  • 1970-01-01
  • 2017-02-06
  • 2019-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多