我有一个包含客户id
,date
和price
的数据框,我希望汇总除第一次购买每个id
之外的所有价格。< / p>
df=pd.DataFrame([[1,1,1],[1,1,1],[1,2,1],[1,2,4],[1,3,1],[2,2,1],[2,3,3]], columns=["id", "date", "price"])
s=df.groupby(["id","date"]).price.sum()
# id date
# 1 1 2
# 2 5
# 3 1
# 2 2 1
# 3 3
我想除了每个id的最小日期之外的所有价格(id 1的日期1; id 2的日期2)。结果将是5 + 1 + 3 = 9.
那么,我必须对索引的一部分进行排名,并将此结果与之前的聚合相结合?
有什么建议吗?
答案 0 :(得分:1)
您可以按级别排序如下:
s = s.sortlevel([0,1])
我们可以先按组(按第一单元)求和,然后对结果求和
In[153]: s.groupby(level=0).apply(lambda x: sum(x.iloc[1:]))
Out[153]:
id
1 6
2 3
dtype: int64
In[154]: s.groupby(level=0).apply(lambda x: sum(x.iloc[1:])).sum()
Out[154]: 9
如果你想要更高级的东西,而不是iloc[]
运算符可以使用的逻辑,你应该有一个单独的函数,而不是lambda
import numpy as np
def is_prime(n):
if n < 2:
return True
for i in np.arange(2, n-1):
if (n%i) == 0:
return False
return True
def select_and_sum(group):
n = len(group)
r = range(n)
primes = [j for j in r if is_prime(j) == True]
return group.iloc[primes].sum()
s.groupby(level=0).apply(select_and_sum)