добавление 1 к предыдущей строке в зависимости от условий - PullRequest
1 голос
/ 24 октября 2019

У меня есть pandas dataframe, как показано ниже:

data=[['A',1,30],
      ['A',1,2],
      ['A',0,4],
      ['A',1,4],
      ['B',0,5],
      ['B',1,1],
      ['B',0,5],
      ['B',1,8]]

df = pd.DataFrame(data,columns=['group','var_1','var_2'])

Я хочу создать серию значений с индексом на основе условия ниже:

Шаг 1) Приращение всегда должно происходить с 1-го числастрока 'var_2' каждой группы. Например: для группы A, приращение должно начинаться с 30, а для группы B, приращение должно начинаться с 5 Шаг 2) Увеличенное значение, где 'var_1 "= 1

Мой желаемый результат:

0    30
1    31
3    32
5    6
7    7

Ответы [ 2 ]

1 голос
/ 24 октября 2019

IIUC:

#Get first index in each group and union index where var_1 ==1
indx = df.drop_duplicates('group').index.union(df[(df['var_1']==1)].index)

#Reindex dataframe group by group, add cusum value to other present values in group.   
#Use .loc to filter where var_1 != 0 and get column var_2
df.reindex(indx).groupby('group')\
  .transform(lambda x: x.iloc[0] + x.shift().notna().cumsum())\
  .loc[lambda x: x.var_1 !=0, 'var_2']

Выход:

0    30
1    31
3    32
5     6
7     7
Name: var_2, dtype: int64
0 голосов
/ 24 октября 2019

Попробуйте groupby cumcount и first

df1 = df.loc[df.var_1.eq(1)]
g = df1.groupby('group')['var_2']

g.transform('first') + g.cumcount()

Out[66]:
0    30
1    31
3    32
5     1
7     2
dtype: int64

Или используйте duplicated с df.where и cumsum

df1 = df.loc[df.var_1.eq(1)]
df1.var_2.where(~df1.duplicated('group'), 1).groupby(df1.group).cumsum()

Out[77]:
0    30
1    31
3    32
5     1
7     2
Name: var_2, dtype: int64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...