想要选择:
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
魔术就是我想要的。
答案 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
})