Панды: 1 кадр данных, сравнивающий строки для создания нового столбца - PullRequest
0 голосов
/ 19 сентября 2018

Привет, замечательные люди из stackoverflow,

У меня есть проблема, с которой я не могу разобраться.

df1 выглядит следующим образом:

Group     item     Quarter    price    quantity

1         A        2017Q3     0.10     1000 
1         A        2017Q4     0.11     1000 
1         A        2018Q1     0.11     1000
1         A        2018Q2     0.12     1000 
1         A        2018Q3     0.11     1000

Требуемый результат - новый фрейм данных, называемый df2 с дополнительным столбцом.

Group     item     Quarter    price    quantity    savings/lost

1         A        2017Q3     0.10     1000         0.00   
1         A        2017Q4     0.11     1000         0.00
1         A        2018Q1     0.11     1000         0.00
1         A        2018Q2     0.12     1000         0.00
1         A        2018Q3     0.11     1000         10.00
1         A        2018Q4     0.13     1000         -20.00

По сути, я хочу пройтись по каждой строке, посмотреть на квартал, найти аналогичный квартал прошлых лет и сделать расчет (цена в этом квартале - цена в последнем квартале * количество).Если данных за предыдущий квартал нет, просто укажите в последнем столбце.

И чтобы завершить картину, там есть больше групп и предметов, и даже больше кварталов, таких как 2016Q1, 2017Q1, 2018Q1, хотя мне нужно только сравнить год назад.Кварталы в строковом формате.

Любая помощь будет принята с благодарностью.Спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Использование pandas.DataFrame.shift

В приведенном ниже коде предполагается, что ваш столбец Quarter отсортирован, и в нем нет пропущенных кварталов.Вы можете попробовать использовать следующий код:

# Input dataframe
  Group item Quarter  price  quantity
0     1    A  2017Q3   0.10      1000
1     1    A  2017Q4   0.11      1000
2     1    A  2018Q1   0.11      1000
3     1    A  2018Q2   0.12      1000
4     1    A  2018Q3   0.11      1000
5     1    A  2018Q4   0.13      1000

# Code to generate your new column 'savings/lost'
df['savings/lost'] =  df['price'] * df['quantity'] - df['price'].shift(4) * df['quantity'].shift(4)

# Output dataframe
  Group item Quarter  price  quantity  savings/lost
0     1    A  2017Q3   0.10      1000           NaN
1     1    A  2017Q4   0.11      1000           NaN
2     1    A  2018Q1   0.11      1000           NaN
3     1    A  2018Q2   0.12      1000           NaN
4     1    A  2018Q3   0.11      1000          10.0
5     1    A  2018Q4   0.13      1000          20.0

Надеюсь, это вам поможет.

Обновление

Я обновил свой код для обработки двух вещейсначала отсортируйте Quarter, а затем обработайте отсутствующий сценарий Quarter.Для группировки по столбцам вы можете обратиться к pandas.DataFrame.groupby и ко многим pd.groupby связанным вопросам, на которые уже даны ответы на этом сайте.

#Input dataframe
  Group item Quarter  price  quantity
0     1    A  2014Q3   0.10       100
1     1    A  2017Q2   0.16       800
2     1    A  2017Q3   0.17       700
3     1    A  2015Q4   0.13       400
4     1    A  2016Q1   0.14       500
5     1    A  2014Q4   0.11       200
6     1    A  2015Q2   0.12       300
7     1    A  2016Q4   0.15       600
8     1    A  2018Q1   0.18       600
9     1    A  2018Q2   0.19       500

#Code to do the operations
df.index = pd.PeriodIndex(df.Quarter, freq='Q')
df.sort_index(inplace=True)
df2 = df.reset_index(drop=True)
df2['Profit'] = (df.price * df.quantity) - (df.reindex(df.index - 4).price * df.reindex(df.index - 4).quantity).values
df2['Profit'] = np.where(np.in1d(df.index - 4, df.index.values),
                        df2.Profit, ((df.price * df.quantity) - (df.price.shift(1) * df.quantity.shift(1))))
df2.Profit.fillna(0, inplace=True)

#Output dataframe
  Group item Quarter  price  quantity  Profit
0     1    A  2014Q3   0.10       100     0.0
1     1    A  2014Q4   0.11       200    12.0
2     1    A  2015Q2   0.12       300    14.0
3     1    A  2015Q4   0.13       400     0.0
4     1    A  2016Q1   0.14       500    18.0
5     1    A  2016Q4   0.15       600     0.0
6     1    A  2017Q2   0.16       800    38.0
7     1    A  2017Q3   0.17       700    -9.0
8     1    A  2018Q1   0.18       600   -11.0
9     1    A  2018Q2   0.19       500     0.0

Я надеюсь, что это решение проблемыописано здесь.

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