我想知道是否有更简单的方法从以下数据创建按 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 有两个 time == 1 的观测值,而 id == 2 的观测值为零。类似地,id == 1 有一个 time == 2 的观察值,而 id == 2 有两个。
最佳答案
在“时间”列上使用广播比较与您选择的时间值,然后使用 groupby
和 transform
将总和广播到原始列。这是一个例子:
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
关于python - 按组计数并分配给新变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56245845/