我正在尝试计算数据帧中某些值的计数
user_id event_type
1 a
1 a
1 b
2 a
2 b
2 c
我想得到像这样的桌子
user_id event_type event_type_a event_type_b event_type_c
1 a 2 1 0
1 a 2 1 0
1 b 2 1 0
2 a 1 1 1
2 b 1 1 1
2 c 1 1 1
我尝试过类似的代码
df[' event_type_a'] = df['user_id', 'event_type'].where(df['event_type']=='a').groupby([user_id]).count()
并获得像这样的表
user_id count_a
1 2
2 1
我应该如何将此值插入默认的df,以填充所有没有NaN项目的行?
也许存在方法,例如"insert into df_1['column'] from df_2['column'] where df_1['user_id'] == df_1['user_id'] "
答案 0 :(得分:5)
将crosstab
与add_prefix
一起用于新列名和join
:
df2 = pd.crosstab(df['user_id'],df['event_type'])
#alternatives
#df2 = df.groupby(['user_id','event_type']).size().unstack(fill_value=0)
#df2 = df.pivot_table(index='user_id', columns='event_type', fill_value=0, aggfunc='size')
df = df.join(df2.add_prefix('event_type_'), on='user_id')
print (df)
user_id event_type event_type_a event_type_b event_type_c
0 1 a 2 1 0
1 1 a 2 1 0
2 1 b 2 1 0
3 2 a 1 1 1
4 2 b 1 1 1
5 2 c 1 1 1
答案 1 :(得分:3)
这是另一种获取jef提到的df2的方法,但略有不同,因为我使用static int[] rotLeft(int[] a, int d) {
for (int i = 0; i < d; i++) {
oneRotation(a);
}
return a;
}
static void oneRotation(int[] a) {
int firstElement = a[0];
for (int i = 0; i < a.length - 1; i++) {
a[i] = a[i + 1];
}
a[a.length - 1] = firstElement;
}
并且未提供transform
格式,所以df2形状的长度与原始df < / p>
agg
然后使用df2= df.set_index('user_id').event_type.str.get_dummies().groupby(level=0).transform('sum')
df2
Out[11]:
a b c
user_id
1 2 1 0
1 2 1 0
1 2 1 0
2 1 1 1
2 1 1 1
2 1 1 1
concat