我有一个像这样的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
答案 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