2016-11-07 82 views
1

我有一個熊貓數據幀,看起來像這樣:添加列具有計數

d = {'device' : ['D1', 'D1', 'D1', 'D1', 'D1', 'D2', 'D2', 'D2', 'D2', 'D2',], 
    'interval' : ['Day 1', 'Day 1', 'Day 1', 'Day 2', 'Day 2', 'Day 2', 'Day 3', 'Day 3', 'Day 3', 'Day 3'], 
    'data' : np.random.rand(10) } 

df = pd.DataFrame(d) 
df.set_index(['device','interval'], inplace=True) 
print(df) 

        data 
device interval   
D1  Day 1  0.087297 
     Day 1  0.849820 
     Day 1  0.577146 
     Day 2  0.027389 
     Day 2  0.469095 
D2  Day 2  0.685370 
     Day 3  0.988979 
     Day 3  0.092372 
     Day 3  0.578315 
     Day 3  0.052130 

我想補充一點,每個計算設備inverval出現的次數列。例如,我希望結果看起來像這樣。

    data count 
device interval   
D1  Day 1  0.087297 1 
     Day 1  0.849820 2 
     Day 1  0.577146 3 
     Day 2  0.027389 1 
     Day 2  0.469095 2 
D2  Day 2  0.685370 1 
     Day 3  0.988979 1 
     Day 3  0.092372 2 
     Day 3  0.578315 3 
     Day 3  0.052130 4 

回答

1

您可以通過group荷蘭國際集團的指標水平和使用transform申請加計列一個lambda調用每個使用參數method='dense' and上行分組rank = FALSE`:

In [15]: 
df['count'] = df.groupby(level=[0,1]).transform(lambda x: x.rank(method='dense', ascending=False)) 
df 

Out[15]: 
        data count 
device interval     
D1  Day 1  0.442826  1 
     Day 1  0.307261  2 
     Day 1  0.040172  3 
     Day 2  0.489025  1 
     Day 2  0.210805  2 
D2  Day 2  0.335703  1 
     Day 3  0.659730  1 
     Day 3  0.658278  2 
     Day 3  0.296398  3 
     Day 3  0.218484  4 
+0

這完全適用的例子。在我的真實數據集中,我有更多的列,所以我得到'ValueError:錯誤的項目數量通過20,放置意味着1'任何提示? – agf1997

+0

您可能需要訪問您的案例中的特定列,請嘗試'df ['count'] = df.groupby(level = [0,1])['data']。transform(lambda x:x.rank(method ='密集',升序=假))' – EdChum

+0

奇妙地工作。只需要注意'數據'欄中沒有重複的數據。 – agf1997

1

我不知道是否有什麼更好的辦法來做到這一點的大熊貓,但在純Python中,你可以向你的d字典添加一個鍵:

d['count'] = [d['interval'][:i].count(day)+1 for i, day in enumerate(d['interval'])] 

這將增加count關鍵與價值你的字典爲:

[1, 2, 3, 1, 2, 3, 1, 2, 3, 4]