使用 groupby 和合并在 pandas 中创建新列

Use groupby and merge to create new column in pandas

所以我有一个看起来像这样的 pandas 数据框。

    name  is_something
0   a     0
1   b     1
2   c     0
3   c     1
4   a     1
5   b     0
6   a     1
7   c     0
8   a     1

有没有办法使用 groupby 和 merge 来创建一个新列,该列给出名称在整个数据框中 is_something 值为 1 的出现次数?更新后的数据框如下所示:

    name  is_something no_of_times_is_something_is_1
0   a     0            3
1   b     1            1
2   c     0            1
3   c     1            1
4   a     1            3
5   b     0            1
6   a     1            3
7   c     0            1  
8   a     1            3

我知道您可以循环遍历数据框来执行此操作,但我正在寻找一种更有效的方法,因为我正在使用的数据集非常大。提前致谢!

如果 is_something 列中只有 01 值,则仅使用 sumGroupBy.transform 用于由聚合值填充的新列:

df['new'] = df.groupby('name')['is_something'].transform('sum')
print (df)
  name  is_something  new
0    a             0    3
1    b             1    1
2    c             0    1
3    c             1    1
4    a             1    3
5    b             0    1
6    a             1    3
7    c             0    1
8    a             1    3

如果可能,多个值首先通过 1 进行比较,转换为整数,然后使用 transformsum:

df['new'] = df['is_something'].eq(1).view('i1').groupby(df['name']).transform('sum')

你可以这样做:

df['new'] = df.groupby('name')['is_something'].transform(lambda xs: xs.eq(1).sum())
print(df)

输出

  name  is_something  new
0    a             0    3
1    b             1    1
2    c             0    1
3    c             1    1
4    a             1    3
5    b             0    1
6    a             1    3
7    c             0    1
8    a             1    3

或者我们只是映射它

df['New']=df.name.map(df.query('is_something ==1').groupby('name')['is_something'].sum())
df
  name  is_something  New
0    a             0    3
1    b             1    1
2    c             0    1
3    c             1    1
4    a             1    3
5    b             0    1
6    a             1    3
7    c             0    1
8    a             1    3