如何在pandas中添加“group in group”列?

时间:2015-06-09 23:03:24

标签: python pandas

采用以下数据框:

import pandas as pd
df = pd.DataFrame({'group_name': ['A','A','A','B','B','B'],
                   'timestamp': [4,6,1000,5,8,100],
                   'condition': [True,True,False,True,False,True]})

我想添加两列:

  1. 该组中的行的顺序
  2. 每个组中condition列的滚动总和
  3. 我知道我可以通过自定义申请来做,但我想知道是否有人有任何有趣的想法? (当有很多小组时,这也很慢。)这是一个解决方案:

    def range_within_group(input_df):
        df_to_return = input_df.copy()
        df_to_return = df_to_return.sort('timestamp')
        df_to_return['order_within_group'] = range(len(df_to_return))
        df_to_return['rolling_sum_of_condition'] = df_to_return.condition.cumsum()
        return df_to_return
    
    df.groupby('group_name').apply(range_within_group).reset_index(drop=True)
    

1 个答案:

答案 0 :(得分:3)

GroupBy.cumcount

  

将每组中的每个项目从0编号到该组的长度 - 1。

如此简单:

>>> gr = df.sort('timestamp').groupby('group_name')
>>> df['order_within_group'] = gr.cumcount()
>>> df['rolling_sum_of_condition'] = gr['condition'].cumsum()