按组计数并分配给新变量

时间:2019-05-21 20:22:41

标签: python pandas

我想知道是否有一种更简单的方法来根据以下数据创建按ID分组的变量“ freq_t1”和“ freq_t2”:

import numpy as np
import pandas as pd

df = pd.DataFrame({
    'id':[1,1,1,2,2,2],
    'time':[1,1,2,3,2,2]
})

df = pd.DataFrame({
    'id':[1,1,1,2,2,2],
    'time':[1,1,2,3,2,2],
    'freq_t1':[2,2,2,0,0,0],
    'freq_t2':[1,1,1,2,2,2]
})

也就是说,id == 1有两个对时间== 1的观察,而id == 2具有零。类似地,id == 1有一个时间== 2的观测值,而id == 2有两个观测值。

1 个答案:

答案 0 :(得分:3)

使用“时间”列上的广播比较与选定的时间值,然后使用groupbytransform将总和广播到原始列。这是一个示例:

tvals = [1, 2]
(pd.DataFrame(df['time'].values[:,None] == tvals, columns=tvals)
   .groupby(df['id'])
   .transform('sum')
   .astype(int)
   .add_prefix('freq_t'))

   freq_t1  freq_t2
0        2        1
1        2        1
2        2        1
3        0        2
4        0        2
5        0        2

tvals = [1, 2, 3]产生

   freq_t1  freq_t2  freq_t3
0        2        1        0
1        2        1        0
2        2        1        0
3        0        2        1
4        0        2        1
5        0        2        1

如果要为所有t值添加列,还可以使用get_dummies

pd.get_dummies(df.time).groupby(df.id).transform('sum').add_prefix('freq_t')

   freq_t1  freq_t2  freq_t3
0        2        1        0
1        2        1        0
2        2        1        0
3        0        2        1
4        0        2        1
5        0        2        1

最后,要将结果连接到df,请使用pd.concat

res = pd.get_dummies(df.time).groupby(df.id).transform('sum').add_prefix('freq_t')
pd.concat([df, res], axis=1)

   id  time  freq_t1  freq_t2  freq_t3
0   1     1        2        1        0
1   1     1        2        1        0
2   1     2        2        1        0
3   2     3        0        2        1
4   2     2        0        2        1
5   2     2        0        2        1