熊猫:如何计算离职率?

时间:2017-04-07 10:56:33

标签: pandas numpy

我想计算一组使用熊猫的人的流动率。小组的规模可能会发生变化,但我想知道每年离开的人数百分比。

更好地用一个例子来解释。这是我的示例数据:

  teachers  year
0     John  2007
1     Paul  2007
2     Mary  2007

3     John  2008
4     Paul  2008
5     Abel  2008
6     Watt  2008

7     John  2009
8     Mary  2009

我想到达这个数据集:

year turnover 
2008 .33333 
2009 .75

第一年,玛丽离开,第二年保罗,亚伯和瓦特离开了。这会有一些偏见:如果集团正在萎缩,那么周转率会更大。

3 个答案:

答案 0 :(得分:4)

计划

  • 我将使用'year''teachers'设置索引,因此我assign提前为x=1虚拟变量。
  • 我想将'year'作为索引,因此我unstack'teachers'放入列中。我使用fill_value=0选项填写零,其中教师在特定年份不在那里。
  • 使用diff并检查是否等于-1表示营业额事件。 sum(1)总结所有营业额事件。
  • d1.sum(1).shift()统计上一年的所有教师。
  • 除以获得营业额。
d1 = pd.Series(1, [df.year, df.teachers]).unstack(fill_value=0)
d1.diff().eq(-1).sum(1).div(d1.sum(1).shift(), 0).dropna()

year
2008    0.333333
2009    0.750000
dtype: float64

正如@jrjc在评论中指出的那样,我的第一行是crosstab。考虑到这一点,我们可以将代码缩减为:

d1 = pd.crosstab(df.year, df.teachers)
d1.diff().eq(-1).sum(1).div(d1.sum(1).shift(), 0).dropna()

使用pipe

的一行
pd.crosstab(df.year, df.teachers).pipe(
    lambda c: c.diff().eq(-1).sum(1).div(c.sum(1).shift(),0).dropna()
)

答案 1 :(得分:1)

这是一种可能性:

from io import StringIO

import numpy as np
import pandas as pd

data = pd.read_table(StringIO(
"""  teachers  year
0     John  2007
1     Paul  2007
2     Mary  2007
3     John  2008
4     Paul  2008
5     Abel  2008
6     Watt  2008
7     John  2009
8     Mary  2009"""
), delim_whitespace=True, index_col=0)

data['presence'] = 1
teacher_presence = data.groupby(['teachers', 'year']).count().unstack(1).fillna(0)
teacher_presence.columns = teacher_presence.columns.droplevel(0)

teacher_remain = teacher_presence.iloc[:, 1:] * teacher_presence.iloc[:, :-1].values
turnover = 1 - teacher_remain.sum() / teacher_presence.iloc[:, :-1].sum().values
turnover.name = 'turnover'

print(turnover)

结果:

year
2008    0.333333
2009    0.750000
Name: turnover, dtype: float64

答案 2 :(得分:0)

您还可以在分组后将教师转换为expand,然后执行设置操作。

set