添加带计数的列

时间:2016-11-07 21:11:36

标签: python python-3.x pandas

我有一个像这样的pandas数据框:

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

2 个答案:

答案 0 :(得分:1)

我不确定在pandas中是否有更好的方法可以做到这一点,但在普通的python中你可以为d dict添加一个键:

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]

答案 1 :(得分:1)

您可以按group在索引级别添加计数列,然后使用transform在每个分组上使用lambda来调用method='dense' and 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 }}升序= FALSE`:

library(expss)
dfs = structure(list(q1 = c(6L, 5L, 2L, 7L), q2 = c(5L, 5L, 6L, 7L),
               q3 = c(4L, NA, 2L, 7L), q4 = c(NA, 5L, 5L, 5L),
               q5 = c(NA, 6L, 6L, 6L), q6 = c(NA, 6L, 2L, 7L),
               q7 = c(6L, 7L, 7L, 7L), q8 = c(5L, 6L, NA, 7L), q9 = c(6L, 5L, 7L, 7L),
               q10 = c(7L, NA, 5L, 7L), q11 = c(6L, 5L, 7L, 7L), q12 = c(6L, 6L, 2L,  7L),
               q13 = c(6L, 5L, 6L, 7L), q14 = c(4L, 4L, 1L, 7L),
               q15 = c(6L,7L, 4L, 7L)), .Names = c("q1", "q2", "q3", "q4", "q5", "q6",  "q7", "q8", "q9", "q10", "q11", "q12", "q13", "q14", "q15"),
          class = "data.frame", row.names = c(NA,   -4L))


dfs$Index = with(dfs,{
                  gr1 = count_row_if(not_na, q1, q2, q3)>0
                  gr2 = count_row_if(not_na, q4, q5, q6)>0
                  gr3 = count_row_if(not_na, q7, q8, q9)>0
                  gr4 = count_row_if(not_na, q10, q11, q12)>0
                  ifelse(gr1 & gr2 & gr3 & gr4,
                     (sum_row(q1 %to% q15)- count_row_if(not_na, q1  %to% q15))/(count_row_if(not_na, q1  %to% q15)*6)*100,
                        NA
                  )
})

dfs