Используйте groupby и объединяйтесь для создания нового столбца в пандах - PullRequest
2 голосов
/ 08 октября 2019

Итак, у меня есть pandas dataframe, который выглядит примерно так:

    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 ]

4 голосов
/ 08 октября 2019

Если в столбце is_something есть только значения 0 и 1, используйте 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')
3 голосов
/ 08 октября 2019

Или мы просто отображаем это

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
1 голос
/ 08 октября 2019

Вы можете сделать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...