В Pandas, как выполнить некоторые арифметические c вычисления для определенных c последовательных столбцов - PullRequest
0 голосов
/ 10 июля 2020

В следующем коде мне нравится вычислять общее процентное изменение для значения только тогда, когда код равен 'b'. Ожидаемый ответ - 0,6 (что составляет 3/4 * 8/10).

import pandas as pd
import numpy as np
x = pd.DataFrame({'Code':['a', 'a', 'a', 'b', 'b', 'a', 'a', 'a', 'b', 'b', 'b', 'a', 'a'], 'Value': np.arange(13)})

   Code  Value
0     a      0
1     a      1
2     a      2
3     b      3
4     b      4
5     a      5
6     a      6
7     a      7
8     b      8
9     b      9
10    b     10
11    a     11
12    a     12

Я пробовал с df.groupby, но поскольку есть две группы 'b', он не делает то, что я ожидается.

Заранее большое спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

То, что вы пытаетесь вычислить, требует, чтобы вы сгруппировали

  1. последовательные строки
  2. с общим свойством значений их столбцов.

Обратите внимание, что группировка последовательных строк - это группировка данных на основе свойства индекса . Распространенный и очень гибкий трюк, который вы можете использовать в подобных случаях, - это ввести новый столбец , в котором хранится свойство индекса, который вам нужен.

В этом случае вы можете отслеживать в столбец, сколько раз значение в столбце Code изменялось между последовательными строками:

(x.assign(code_changed=lambda df: df.Code != df.Code.shift(),
          ordered_code=lambda df: df.code_changed.cumsum())
    Code    Value   code_changed    ordered_code
0   a       0       True            1
1   a       1       False           1
2   a       2       False           1
3   b       3       True            2
4   b       4       False           2
5   a       5       True            3
6   a       6       False           3
7   a       7       False           3
8   b       8       True            4
9   b       9       False           4
10  b       10      False           4
11  a       11      True            5
12  a       12      False           5

Столбец ordered_code содержит точную информацию о группировке, которую вы ищете. Затем вы можете получить результат, на который надеетесь, ограничившись строками с Code равным 'b' и суммируя Value s:

(x.assign(code_changed=lambda df: df.Code != df.Code.shift(),
          ordered_code=lambda df: df.code_changed.cumsum())
  .pipe(lambda df: df[df.Code == 'b'])
  .groupby('ordered_code')
  .Value
  .agg(lambda values: values.iloc[0] / values.iloc[-1])
  .prod())

Это дает

0.6000000000000001

по желанию.

0 голосов
/ 10 июля 2020

Затем возьмите любые желаемые значения из pct_change и умножьте их вместе, как вы sh.

pct_change = df.loc[df['Code'] == 'b'].pct_change()

Умножьте первое и третье значение.

pct_change.iloc[[1]].values * pct_change.iloc[[3]].values                                                          

Или если у вас есть несколько значений, вы можете написать al oop, чтобы получить разные строки pct_change.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...