Python - Как сравнить последовательные строки и взять разницу другого соответствующего столбца - PullRequest
0 голосов
/ 16 марта 2020

Я довольно новичок в python и надеюсь, что кто-нибудь поможет мне с этим. У меня есть такой фрейм данных:

dc  region  banner  input_date  week        qty  general
ABC NE      XYZ    2020-03-01   2020-01-02  161 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-02  130 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-03  167 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-03  158 dc_input    
PQR SE      GHQ    2020-03-01   2020-01-04  115 dc_input    
PQR SE      GHQ    2020-03-01   2020-01-04  100 dc_input    

Мой вывод будет выглядеть так:

dc  region  banner  input_date  week        qty  general
ABC NE      XYZ    2020-03-01   2020-01-02  161 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-02  130 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-03  167 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-03  158 dc_input    
PQR SE      GHQ    2020-03-01   2020-01-04  115 dc_input    
PQR SE      GHQ    2020-03-01   2020-01-04  100 dc_input    
ABC NE      XYZ    2020-03-01   2020-01-02  31  sub_output
ABC NE      XYZ    2020-03-01   2020-01-03  9   sub_output
PQR SE      GHQ    2020-03-01   2020-01-04  15  sub_output

Я хочу проверять строку за строкой на равенство, и если они идентичны, я бы взял разница их соответствующего количества и добавьте его в столбец количества в качестве новой строки. Пример - первые две строки идентичны (кроме qty), поэтому мне нужен diff из qty, равный 31, и добавьте строку + diff из qty в качестве новой строки.

Будет ли кто-то в состоянии помочь с кодом python, чтобы получить вышеуказанный вывод? Большое спасибо!

1 Ответ

0 голосов
/ 16 марта 2020

Это должно работать:

Сортировать значения в df по всем столбцам, включая qty, чтобы diff всегда было положительным.

df = df.sort_values(by=['dc','region','banner','input_date','week','qty','general'])

Установите индекс и группу по столбцам, которые вы хотите сравнить. Для каждой группы получите diff() и dropna() (это исключить одинаковые строки группы) и reset_index, чтобы получить все столбцы. Теперь это даст вам фрейм данных с совпадающими строками и qty с diff()

df2 = df.set_index(compare_cols).groupby(compare_cols)['qty'].diff().dropna().reset_index()
df2['general'] = 'sub_output'
print(df2)

Вывод:

    dc region banner  input_date        week     general   qty
0  ABC     NE    XYZ  2020-03-01  2020-01-02  sub_output  31.0
1  ABC     NE    XYZ  2020-03-01  2020-01-03  sub_output   9.0
2  PQR     SE    GHQ  2020-03-01  2020-01-04  sub_output  15.0

Наконец, объедините ваш оригинальный df с этим сгруппированный df с diff

df = (df.reset_index().merge(df2, how='outer').drop('index', axis=1))
print(df)

Выход:

    dc region banner  input_date        week  qty     general
0  ABC     NE    XYZ  2020-03-01  2020-01-02  130    dc_input
1  ABC     NE    XYZ  2020-03-01  2020-01-02  161    dc_input
2  ABC     NE    XYZ  2020-03-01  2020-01-03  158    dc_input
3  ABC     NE    XYZ  2020-03-01  2020-01-03  167    dc_input
4  PQR     SE    GHQ  2020-03-01  2020-01-04  100    dc_input
5  PQR     SE    GHQ  2020-03-01  2020-01-04  115    dc_input
6  ABC     NE    XYZ  2020-03-01  2020-01-02   31  sub_output
7  ABC     NE    XYZ  2020-03-01  2020-01-03    9  sub_output
8  PQR     SE    GHQ  2020-03-01  2020-01-04   15  sub_output
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...