2016-12-29 79 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分鐘。