Добавить значения в новый столбец df на основе условия - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть следующие df, отсортированные по date и по name:

         date     name   valor 
  2  2018-03-01   ACC      75      
  0  2018-03-01   ACE      50     
  0  2018-03-20   ACE      50   
  1  2018-03-01   BBV      20    
  1  2018-03-14   BBV      20
  5  2018-04-16   BBV      58
  6  2018-04-20   BBV     -58

Я с нетерпением жду, чтобы сгенерировать новый column (называемый result) в df, где, если одно из значений в name совпадает с последующим, то сложите их вместе в новом столбце.

Желаемый результат будет выглядеть примерно так:

     date        name    valor  result 
  2  2018-03-01   ACC      75     75
  0  2018-03-01   ACE      50     50
  0  2018-03-20   ACE      50    100 
  1  2018-03-01   BBV      20     20
  1  2018-03-14   BBV      20     40
  5  2018-04-16   BBV      58     98
  6  2018-04-20   BBV     -58     40 

Вот что я пытаюсь:

for index,row in df.iterrows():
    for i in range(1,len(df)+1):
        if (row['name'][i]==row['name'][i+1]) and ( row['name'][i-1]!=row['name'][i]):
            df["result"]=df["valor"][i]+df["valor"][i+1]
        elif (row['name'][i]==row['name'][i+1]) and (row['name'][i-1]==row['name'][i]):
            df["result"]=df["result"][i]+df["valor"][i+1]

Вывод indexing error указывает на string index out of range, однако я уверен, что должен быть более эффективный способ получения желаемого результата.

Спасибо, что прочитали мой пост.

1 Ответ

0 голосов
/ 28 апреля 2018

Вы должны использовать groupby.cumsum для этого. Использование векторизованной функциональности, которая поставляется с pandas, обычно более эффективно и чище, чем итерация строк.

df['result'] = df.groupby('name')['valor'].cumsum()

print(df)

         date name  valor  result
2  2018-03-01  ACC     75      75
0  2018-03-01  ACE     50      50
0  2018-03-20  ACE     50     100
1  2018-03-01  BBV     20      20
1  2018-03-14  BBV     20      40
5  2018-04-16  BBV     58      98
6  2018-04-20  BBV    -58      40
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...