按Pandas中一个指数级别的等级过滤?

时间:2014-08-18 09:50:29

标签: python pandas grouping

我有一个包含客户iddateprice的数据框,我希望汇总除第一次购买每个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.

那么,我必须对索引的一部分进行排名,并将此结果与之前的聚合相结合?

有什么建议吗?

1 个答案:

答案 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)