输入:
MTLTexture
需要按BusId分组,并需要以下输出
输出:
df=pd.DataFrame({
'BusId':['abc1','abc2','abc3','abc1','abc2','abc4'],
"Fair":[5,6,7,10,5,4]
})
感谢您的帮助。
答案 0 :(得分:2)
在您的系列中使用agg
和两个帮助函数来计算每个阈值以上的值。
但是,pandas
的未来版本将弃用我在此处所做的系列汇总。
df.groupby('BusId').Fair.agg({
'gt5': lambda x: (x>=5).sum(),
'gt10': lambda x: (x>=10).sum()
})
gt5 gt10
BusId
abc1 2 1
abc2 2 0
abc3 1 0
abc4 0 0
您还可以删除对lambda
的使用:
out = df.assign(gt5=df.Fair.ge(5), gt10=df.Fair.ge(10))
out.groupby('BusId').agg({'gt5': 'sum', 'gt10': 'sum'}).astype(int)
gt5 gt10
BusId
abc1 2 1
abc2 2 0
abc3 1 0
abc4 0 0
第二种方法会更快一些:
%%timeit
df.groupby('BusId').Fair.agg({
'gt5': lambda x: (x>=5).sum(),
'gt10': lambda x: (x>=10).sum()
})
5.05 ms ± 69 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit
out = df.assign(gt5=df.Fair.ge(5), gt10=df.Fair.ge(10))
out.groupby('BusId').agg({'gt5': 'sum', 'gt10': 'sum'}).astype(int)
3.76 ms ± 44.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
答案 1 :(得分:2)
您可以使用pd.cut
来避免对范围进行硬编码。只需剪切数据,然后应用cumsum
:
binned_data = pd.cut(df.Fair,
bins=[0, 5, 10, np.inf],
labels=['>=0', '>=5', '>=10'],
right=False)
df = (pd.get_dummies(binned_data)
.sort_index(axis=1, ascending=False)
.cumsum(1)
.groupby(df.BusId, sort=False)
.sum()
.iloc[:, 1::-1]))
df
>=5 >=10
BusId
abc1 2 1
abc2 2 0
abc3 1 0
abc4 0 0
答案 2 :(得分:1)
为避免聚合,您也可以改用state.users
。实质与user3483203的答案相同:
apply