group-by + case当等价

时间:2015-05-11 12:36:01

标签: python pandas group-by dataframe

想要选择:

select
    user_id,
    max(case when value > 0 then timestamp else 0 end) as max_timestamp_when_value_is_positive
from df
group by user_id

聚合的正确方法是什么?

groupped = raw_data.groupby('user_id')
res = groupped.agg({<how-to-do-described-aggregation?>})

更新 解释和示例。

In [2]: df = pd.DataFrame({'user_id': [1, 1, 1, 2, 2, 3, 3, 3, 3],
                           'timestamp': [100, 200, 300, 10, 110, 10, 110, 210, 250],
                           'value': [0, 1, 0, 0, 0, 0, 10, 0, 1]})

In [3]: groupped = df.groupby('user_id')

In [4]: res = groupped.agg({'timestamp': [min, max],
                            'value': lambda x: sum(x > 0),
                            <described-magic>})

In [5]: res
Out[5]: 
        timestamp         value   <...magic...>
              min  max <lambda>
user_id                        
1             100  300        1    200
2              10  110        0    0
3              10  250        2    210

魔术就是我想要的。

1 个答案:

答案 0 :(得分:1)

创建新列positive_value_timestamp

df['positive_value_timestamp'] = df.timestamp * df.value.apply(lambda x: 1 if x > 0 else 0)

分组时,请点击此列的max

res = df.groupby('user_id').agg(
    {
        'timestamp': [min, max],
        'value': sum,
        'positive_value_timestamp': max
    })