将值插入没有NaN的列中

时间:2018-12-20 14:39:54

标签: python pandas

我正在尝试计算数据帧中某些值的计数

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'] "

2 个答案:

答案 0 :(得分:5)

crosstabadd_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