2016-11-07 86 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]