2016-12-29 77 views
1

我有一个数据集,列出了他们完成某些操作的员工和时间戳。它分为三列:员工,日期,小时。在熊猫中执行excel-like countifs

我想统计每小时活动的员工数量。 Excel中我将通过添加第四列EmpFactor为此在其中予执行COUNTIFS操作:

=1/COUNTIFS(Name range;Name;Date range;Date;Hour range;Hour) 

我随后可以通过在EmpFactor列执行SUMIF计算活性的员工数量。

我尝试下面的代码组成EmpFactor使用列大熊猫:

for name,date,time in zip(df['Employee'],df['Date'],df['Time']): 
    df['EmpFactor'] = 1/(df[(df.Employee == name) and (df.Day == dag) 
          and (df.Time == tijd)].count()) 

然而,这是行不通的。我已经在SO上搜索了很多主题,但还没有找到合适的答案。

+2

这将有助于获得样本数据和预期输出。 – Zero

+0

它可能并不高雅,但如果你只是迭代你的数组和+ =到一个匹配的计数器,然后进行反演,那么它就是一个开始。 –

+0

谢谢!我选择了后一种方法,这似乎奏效。 – TimH

回答

1

这个数据帧开始:

df = pd.DataFrame({'Employee': list('ABCDEFGH'), 
        'Date': [1, 1, 1, 2, 2, 2, 3, 3], 
        'Time': [10, 10, 10, 11, 10, 11, 11, 12]}) 
print(df) 

输出:

Date Employee Time 
0  1  A 10 
1  1  B 10 
2  1  C 10 
3  2  D 11 
4  2  E 10 
5  2  F 11 
6  3  G 11 
7  3  H 12 

您可以通过DateTime并计算员工组:

per_hour = df.groupby(['Date', 'Time']).count() 
per_hour['EmpFactor'] = 1/per_hour.Employee 
print(per_hour) 

输出:

  Employee EmpFactor 
Date Time      
1 10   3 0.333333 
2 10   1 1.000000 
    11   2 0.500000 
3 11   1 1.000000 
    12   1 1.000000 
1

假设你有数据帧的这样的结构:

import pandas as pd 
import numpy as np 
df = pd.DataFrame([['Alice', '2012-03-05', 23], 
        ['Fred', '2012-03-05', 23], 
        ['Bob', '2012-12-12', 00]], 
        columns=('Employee', 'Date', 'Time')) 

# Here you have: 
    Employee  Date Time 
0  Alice 2012-03-05 23 
1  Fred 2012-03-05 23 
2  Bob 2012-12-12  0 

# convert to a date 
df['DateTime']=pd.to_datetime(df['Date']) 
# make it index 
df2=df.set_index('DateTime') 
# group by date and time 
g = df2.groupby([pd.TimeGrouper('D'), 'Time']) 
# get counts: 
print(g.count()) 

#Here you have: 
        Employee Date 
DateTime  Time 
2012-03-05  23   2  2 
2012-12-12  0   1  1 


# to get inverted values: 
print(1/g.count()) 

        Employee Date 
DateTime  Time 
2012-03-05 23   0.5 0.5 
2012-12-12 0   1.0 1.0 

当然,更好的使DateTimeTime一部分。你可以练习它,如果你愿意:)

这种方法是相当快的:我的笔记本电脑分组47M行大约需要3分钟。