使用groupby并合并以在熊猫中创建新列

时间:2019-10-08 13:36:41

标签: python pandas pandas-groupby python-3.7

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

    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并合并以创建新列的方法,该列给出了在整个数据框中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

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

3 个答案:

答案 0 :(得分:5)

如果0列中仅包含1is_something值,则仅将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')

答案 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

答案 2 :(得分:1)

您可以这样做:

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