所以我有一个看起来像这样的熊猫数据框。
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
我知道您可以遍历数据框来执行此操作,但是我正在寻找一种更有效的方法,因为正在使用的数据集非常大。预先感谢!
答案 0 :(得分:5)
如果0
列中仅包含1
和is_something
值,则仅将sum
和GroupBy.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
进行比较,转换为整数,然后将transform
与sum
一起使用:
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