我想计算一组使用熊猫的人的流动率。小组的规模可能会发生变化,但我想知道每年离开的人数百分比。
更好地用一个例子来解释。这是我的示例数据:
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
第一年,玛丽离开,第二年保罗,亚伯和瓦特离开了。这会有一些偏见:如果集团正在萎缩,那么周转率会更大。
答案 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