DataFrame арифметика на основе подмножества - PullRequest
0 голосов
/ 11 сентября 2018

Наличие кадра данных, похожего на:

Country Column1 Product Week        Val
UK      S1      A       2019-36     10
UK      S1      A       2019-37     20
UK      S1      A       2019-38     30
UK      S1      B       2019-36     30
UK      S1      B       2019-37     30
UK      S1      B       2019-38     30
DE      S1      A       2019-39     100
DE      S1      A       2019-40     100
DE      S1      A       2019-41     100
DE      S1      B       2019-36     10
DE      S1      B       2019-37     15
DE      S1      B       2019-38     10

Как можно сказать: Если Product = "B", тогда взять VAL из продукта "A", где все остальные столбцы одинаковы (Country, Column1 & Week) и добавить 50% этого Val к текущему значению?

например. Первый «B» будет иметь значение 35:

30 + (50%*10)

Второй 40:

30 + (50%*20)

и третий 45:

30 + (50%*30)

Ответы [ 2 ]

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

Как насчет игры с индексами?

Предположим, у вас есть данные в pandas.DataFrame под названием data

data = data.set_index(["Country", "Column1", "Week", "Product"], drop=False)
df1 = data[data.Product == "A"].set_index(["Country", "Column1", "Week"], drop=False)
df2 = data[data.Product == "B"].set_index(["Country", "Column1", "Week"], drop=False)
df2.Val += df1.Val * .5  # so that rows with all else the same would add
df2 = df2.set_index(["Country", "Column1", "Week", "Product"])
data.update(df2)
data["Index"] = range(len(data.Val))
data = data.set_index("Index")
data.index.name = None

Я думаю, что преимущество этого подхода в том, что он полностью соответствуетваши требования и достижения результата на месте .Это производит

   Country Column1 Product     Week    Val
0       UK      S1       A  2019-36   10.0
1       UK      S1       A  2019-37   20.0
2       UK      S1       A  2019-38   30.0
3       UK      S1       B  2019-36   35.0
4       UK      S1       B  2019-37   40.0
5       UK      S1       B  2019-38   45.0
6       DE      S1       A  2019-39  100.0
7       DE      S1       A  2019-40  100.0
8       DE      S1       A  2019-41  100.0
9       DE      S1       B  2019-36   10.0
10      DE      S1       B  2019-37   15.0
11      DE      S1       B  2019-38   10.0
0 голосов
/ 11 сентября 2018

Если дважды использовать pd.Groupby для 'Страна', 'Столбец1', 'Неделя', условно для Столбца2:

B = df[df['Column2']=='B'].groupby(['Country','Column1','Week']).sum()
A = df[df['Column2']=='A'].groupby(['Country','Column1','Week']).sum() 
0.5*A + B

Вывод

                          Val
Country Column1 Week         
DE      S1      2019-36   NaN
                2019-37   NaN
                2019-38   NaN
                2019-39   NaN
                2019-40   NaN
                2019-41   NaN
UK      S1      2019-36  35.0
                2019-37  40.0
                2019-38  45.0

Thisработает только если есть уникальные значения для выбора Country, Column1, Week

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