Рассчитать столбец на основе ограничений в кадре данных - PullRequest
0 голосов
/ 24 октября 2019

У меня есть фрейм данных

I_Code  Date_1   Date_2     C_B
4   01/09/2019  02/08/2019  7
4   01/09/2019  03/08/2019  1189
1   02/09/2019  03/08/2019  3
2   02/09/2019  03/08/2019  4
1   01/09/2019  04/08/2019  8
4   01/09/2019  04/08/2019  1650
1   02/09/2019  04/08/2019  138
2   02/09/2019  04/08/2019  8
1   03/09/2019   04/08/2019 6
2   03/09/2019  04/08/2019  2
1   01/09/2019  05/08/2019  9
4   01/09/2019  05/08/2019  1805
1   02/09/2019  05/08/2019  259
2   02/09/2019  05/08/2019  1062
1   03/09/2019  05/08/2019  4
2   03/09/2019  05/08/2019  161
2   04/09/2019  05/08/2019  7
5   04/09/2019  05/08/2019  12
1   01/09/2019  06/08/2019  63
2   01/09/2019  06/08/2019  2

Я хочу вычислить столбец c_b1, который вычисляется для каждой даты_1, и I_code так, что для каждой даты_1 и I_Code я хочу вычесть C_b для следующей записи. Например -

I_Code  Date_1   Date_2        C_B    C_B1
    4   01/09/2019  02/08/2019  7      7
    4   01/09/2019  03/08/2019  1189   1189-7 (Since date_1 and I_Code are same in entry 1)
    1   02/09/2019  03/08/2019  3       3
    2   02/09/2019  03/08/2019  4       4
    1   01/09/2019  04/08/2019  8       8
    4   01/09/2019  04/08/2019  1650    1650-1189 (Since date_1 and I_Code are same in entry 2)
    1   02/09/2019  04/08/2019  138     138-3
    2   02/09/2019  04/08/2019  8       8-3

Может кто-нибудь помочь в достижении того же.

Спасибо

Ответы [ 2 ]

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

Используйте DataFrameGroupBy.shift, замените отсутствующие значения на 0 и вычтите:

df['C_B1'] = df['C_B'] - df.groupby(['I_Code','Date_1'])['C_B'].shift().fillna(0)

Альтернативно с Series.sub и fill_value=0 параметром:

df['C_B1'] = df['C_B'].sub(df.groupby(['I_Code','Date_1'])['C_B'].shift(), fill_value=0)

print (df)
    I_Code      Date_1      Date_2   C_B    C_B1
0        4  01/09/2019  02/08/2019     7     7.0
1        4  01/09/2019  03/08/2019  1189  1182.0
2        1  02/09/2019  03/08/2019     3     3.0
3        2  02/09/2019  03/08/2019     4     4.0
4        1  01/09/2019  04/08/2019     8     8.0
5        4  01/09/2019  04/08/2019  1650   461.0
6        1  02/09/2019  04/08/2019   138   135.0
7        2  02/09/2019  04/08/2019     8     4.0
8        1  03/09/2019  04/08/2019     6     6.0
9        2  03/09/2019  04/08/2019     2     2.0
10       1  01/09/2019  05/08/2019     9     1.0
11       4  01/09/2019  05/08/2019  1805   155.0
12       1  02/09/2019  05/08/2019   259   121.0
13       2  02/09/2019  05/08/2019  1062  1054.0
14       1  03/09/2019  05/08/2019     4    -2.0
15       2  03/09/2019  05/08/2019   161   159.0
16       2  04/09/2019  05/08/2019     7     7.0
17       5  04/09/2019  05/08/2019    12    12.0
18       1  01/09/2019  06/08/2019    63    54.0
19       2  01/09/2019  06/08/2019     2     2.0
1 голос
/ 24 октября 2019

IIUC:

df["C_B_1"] = df.groupby(["Date_1","I_Code"])["C_B"].apply(lambda x: x-x.shift()).fillna(df['C_B'])

print (df)
#
    I_Code      Date_1      Date_2   C_B   C_B_1
0        4  01/09/2019  02/08/2019     7     7.0
1        4  01/09/2019  03/08/2019  1189  1182.0
2        1  02/09/2019  03/08/2019     3     3.0
3        2  02/09/2019  03/08/2019     4     4.0
4        1  01/09/2019  04/08/2019     8     8.0
5        4  01/09/2019  04/08/2019  1650   461.0
6        1  02/09/2019  04/08/2019   138   135.0
7        2  02/09/2019  04/08/2019     8     4.0
8        1  03/09/2019  04/08/2019     6     6.0
9        2  03/09/2019  04/08/2019     2     2.0
10       1  01/09/2019  05/08/2019     9     1.0
11       4  01/09/2019  05/08/2019  1805   155.0
12       1  02/09/2019  05/08/2019   259   121.0
13       2  02/09/2019  05/08/2019  1062  1054.0
14       1  03/09/2019  05/08/2019     4    -2.0
15       2  03/09/2019  05/08/2019   161   159.0
16       2  04/09/2019  05/08/2019     7     7.0
17       5  04/09/2019  05/08/2019    12    12.0
18       1  01/09/2019  06/08/2019    63    54.0
19       2  01/09/2019  06/08/2019     2     2.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...