2017-03-11 30 views
2

我有以下格式的熊貓數據幀:Python的選擇和計數元件

import pandas as pd 

d1 = {'Product ID': ['A','B','C','D','A','D','E','A','B','C','B','C','E'], 
'Buyer ID': [1,1,1,1,2,2,2,3,3,3,4,5,5]} 
df1 = pd.DataFrame(d1) 

其是以下格式:

Product ID Buyer ID 
A    1 
B    1 
C    1 
D    1 
A    2 
D    2 
E    2 
A    3 
B    3 
C    3 
B    4 
C    5 
E    5 

數據幀示出了通過一個單獨的隨時間推移所購買的產品。

我想要做的是獲取個人購買的第一個和最後一個產品以及第一個和最後一個購買之間購買的產品數量。在我的買家1的例子中,總共購買了4件產品,他的第一次購買是產品A,最後購買的是產品D(最後提供了完整的預期結果表)。如果個人只購買了一種產品,則列出的產品的最終數量爲1。

我想得到的結果是這樣的格式:

Product ID Buyer ID Count 
    A   1   4 
    D   1   4 
    A   2   3 
    E   2   3 
    A   3   3 
    C   3   3 
    B   4   1 
    C   5   2 
    E   5   2 

我不能左右我的頭,以解決這一點。有人可以幫忙嗎?

回答

1

可以使用的功能["first", "last", "count"]列表彙總的結果,然後將其重新塑造你需要的格式:

(df1.groupby("Buyer ID")["Product ID"].agg(["first", "last", "count"]) 
.set_index('count', append=True).stack() 
.reset_index(level=2, drop=True) 
.rename("Product ID").reset_index().drop_duplicates()) 

enter image description here


或者另一種選擇,使用groupby.apply並採取第一行,最後一行用iloc

(df1.groupby("Buyer ID", group_keys=False) 
.apply(lambda g: g.iloc[[0,-1], :].assign(count = len(g))) 
.drop_duplicates()) 

enter image description here

+1

太棒了。非常感謝。 – Prometheus