我想知道有多少人在评估1次,2到3次,3次以上的人群中推出了GRADE
1,2,3,4和5。例如,进行一次评估的人群包含ID为2
和4
的人。在此组中,总共有一个评估5
和一个评估1
。
df =
ID_PERSON EVALUATION_GRADE
1 2
1 2
1 3
1 5
2 5
3 2
3 5
3 1
4 1
5 2
5 1
5 1
结果应该是这个:
result =
FREQUENCY_GROUP GRADE_1 GRADE_2 GRADE_3 GRADE_4 GRADE_5
"1 time" 1 0 0 0 1
"2-3 times" 3 2 0 0 1
"> 3 times" 0 2 1 0 1
如果我执行此操作df.groupby(['EVALUATION_GRADE']).agg({'ID_PERSON': 'count'}).reset_index()
,那么我会获得推送1
,2
,3
,4
和{{1}的总人数}。但是,我如何将它们分成频率组?
答案 0 :(得分:3)
您可以先使用transform
,size
首先使用size
查找频率,然后使用cut
创建分箱,最后groupby
使用df['FREQ'] = df.groupby('ID_PERSON')['EVALUATION_GRADE'].transform('size')
bins = [-np.inf, 1, 3, np.inf]
labels=['1 time','2-3 times','> 3 times']
df.FREQ = pd.cut(df.FREQ, bins=bins, labels=labels)
df = df.groupby(['FREQ', 'EVALUATION_GRADE'])['EVALUATION_GRADE'] \
.size() \
.unstack(fill_value=0) \
.reindex(columns=np.arange(1,6), fill_value=0)
df.columns = 'GRADE ' + df.columns.astype(str)
print (df)
GRADE 1 GRADE 2 GRADE 3 GRADE 4 GRADE 5
FREQ
1 time 1 0 0 0 1
2-3 times 3 2 0 0 1
> 3 times 0 2 1 0 1
,重塑$line = "one two three four four SIX";
$line =~ s/two/six/;
$line =~ s/four/ten/g;
$line =~ s/th(re)e/whe$1/
if ($line =~ /six/i) {
}
3}}并按unstack
填充缺少的列:
grep "__mypassword'" myfile.php | cut -d"'" -f4
答案 1 :(得分:1)
好吧,基本想法可能如下 - 使用GroupBy.transform
获取频率组,然后使用pandas.crosstab.
来转移数据:
>>> def worker(x):
if len(x) == 1:
return "1 time"
elif len(x) <=3 :
return "2-3 times"
else:
return "> 3 times"
>>> df['FREQUENCY_GROUP'] = df.groupby('ID_PERSON').transform(worker)
>>> df
ID_PERSON EVALUATION_GRADE FREQUENCY_GROUP
0 1 2 > 3 times
1 1 2 > 3 times
2 1 3 > 3 times
3 1 5 > 3 times
4 2 5 1 time
5 3 2 2-3 times
6 3 5 2-3 times
7 3 1 2-3 times
8 4 1 1 time
9 5 2 2-3 times
10 5 1 2-3 times
11 5 1 2-3 times
>>> pd.crosstab(df['FREQUENCY_GROUP'], 'GRADE ' + df['EVALUATION_GRADE'].astype('str'))
EVALUATION_GRADE GRADE 1 GRADE 2 GRADE 3 GRADE 5
FREQUENCY_GROUP
1 time 1 0 0 1
2-3 times 3 2 0 1
> 3 times 0 2 1 1
答案 2 :(得分:1)
这是一个应该推广到任意数量的等级或ID的答案
d = {1: '1 time', 2:'2-3 times', 3:'2-3 times', 4:'> 3 times'}
df['FREQUENCY_GROUP'] = df.groupby('ID_PERSON')['ID_PERSON']\
.transform('size')\
.clip_upper(4)\
.map(d)
df1 = df.pivot_table(index='FREQUENCY_GROUP',
columns='EVALUATION_GRADE',
values='ID_PERSON',
aggfunc='count',
fill_value=0)\
.reindex(columns=range(df.EVALUATION_GRADE.min(),
df.EVALUATION_GRADE.max() + 1),
fill_value=0)
df1.columns = 'GRADE_' + df1.columns.astype(str)
GRADE_1 GRADE_2 GRADE_3 GRADE_4 GRADE_5
FREQUENCY_GROUP
1 time 1 0 0 0 1
2-3 times 3 2 0 0 1
> 3 times 0 2 1 0 1