Добавьте столбец в pandas фрейм данных с вычислением между значением строк и условием - PullRequest
1 голос
/ 05 мая 2020

Мне нужно добавить новый столбец («дельта») в фрейм данных, вычислив разницу между каждым значением строки в столбце «значение» и значением в том же столбце, когда num = 5, с тем же цветом и для каждого группа. Результат должен быть следующим:

group   color   num value   delta

Group1  red     1   0.1     -0.4    (0.1 - 0.5 (0.5 is the value in Group1, color=red and num=5))
Group1  green   1   0.2     -0.4    (0.2 - 0.6 (0.6 is the value in Group1, color=green and num=5))
Group1  blue    1   0.3     -0.4    (0.3 - 0.7)
Group1  yellow  1   0.6     0.1     (0.6 - 0.5)
Group1  red     5   0.5     0
Group1  green   5   0.6     0
Group1  blue    5   0.7     0
Group1  yellow  5   0.5     0
Group1  red     7   0.8     0.3
Group1  green   7   0.9     0.3
Group1  blue    7   0.7     0
Group1  yellow  7   0.6     0.1

Group2  red     1   0.1     etc.

Я попытался использовать pivot_table, я полагаю, это начало, но я действительно не вижу, как выполнить это условное вычисление.

Вы есть идеи, как это можно сделать?

Фактический код:

import plotly.graph_objs as go
import pandas as pd

d = {
    "group" : ["Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group1", "Group2", "Group2", "Group2", "Group2", "Group2", "Group2", "Group2", "Group2","Group2", "Group2", "Group2", "Group2"],
    "color" : ["red", "green", "blue", "yellow", "red", "green", "blue", "yellow", "red", "green", "blue", "yellow", "red", "green", "blue", "yellow", "red", "green", "blue", "yellow", "red", "green", "blue", "yellow"],
    "num" : [1, 1, 1, 1, 5, 5, 5, 5, 7, 7, 7, 7, 1, 1, 1, 1, 5, 5, 5, 5, 7, 7, 7, 7],
    "value" : [0.1, 0.2, 0.3, 0.6, 0.5, 0.6, 0.7, 0.5, 0.8, 0.9, 0.7, 0.6, 0.1, 0.2, 0.3, 0.6, 0.5, 0.6, 0.7, 0.5, 0.8, 0.9, 0.7, 0.6,]
    }

df = pd.DataFrame(d)

df_pivot = pd.pivot_table(df, values = ["value"], index = ["group", "color", "num"])

df_pivot["delta"] = df_pivot["value"] # what/how should I substract !?

print(df_pivot)

Ответы [ 3 ]

4 голосов
/ 05 мая 2020

Вот так:

In [1771]: m = df[df.num.eq(5)]
In [1774]: res = pd.merge(df,m, on=['group', 'color']) 
In [1779]: res['delta'] = res['value_x'] - res['value_y'] 

In [1781]: res = res.drop(['num_y', 'value_y'],1).rename(columns={'num_x': 'num', 'value_x': 'value'})                                                                                                      

In [1782]: res                                                                                                                                                                                              
Out[1782]: 
     group   color  num  value  delta
0   Group1     red    1    0.1   -0.4
1   Group1     red    5    0.5    0.0
2   Group1     red    7    0.8    0.3
3   Group1   green    1    0.2   -0.4
4   Group1   green    5    0.6    0.0
5   Group1   green    7    0.9    0.3
6   Group1    blue    1    0.3   -0.4
7   Group1    blue    5    0.7    0.0
8   Group1    blue    7    0.7    0.0
9   Group1  yellow    1    0.6    0.1
10  Group1  yellow    5    0.5    0.0
11  Group1  yellow    7    0.6    0.1
2 голосов
/ 05 мая 2020

Используйте where и transform

df['delta'] = (df.value - 
               df.where(df.num.eq(5)).groupby([df.group,df.color])
                                     .value.transform('first'))

Out[16]:
     group   color  num  value  delta
0   Group1     red    1    0.1   -0.4
1   Group1   green    1    0.2   -0.4
2   Group1    blue    1    0.3   -0.4
3   Group1  yellow    1    0.6    0.1
4   Group1     red    5    0.5    0.0
5   Group1   green    5    0.6    0.0
6   Group1    blue    5    0.7    0.0
7   Group1  yellow    5    0.5    0.0
8   Group1     red    7    0.8    0.3
9   Group1   green    7    0.9    0.3
10  Group1    blue    7    0.7    0.0
11  Group1  yellow    7    0.6    0.1
12  Group2     red    1    0.1   -0.4
13  Group2   green    1    0.2   -0.4
14  Group2    blue    1    0.3   -0.4
15  Group2  yellow    1    0.6    0.1
16  Group2     red    5    0.5    0.0
17  Group2   green    5    0.6    0.0
18  Group2    blue    5    0.7    0.0
19  Group2  yellow    5    0.5    0.0
20  Group2     red    7    0.8    0.3
21  Group2   green    7    0.9    0.3
22  Group2    blue    7    0.7    0.0
23  Group2  yellow    7    0.6    0.1
2 голосов
/ 05 мая 2020

создать (группу, цвет) dict и сопоставить его с каждой строкой.

d = (
    df.groupby(['group','color'])
    .apply(lambda x: x.loc[x.num.eq(5)].head(1)).value
    .reset_index(2,drop=True)
    .to_dict()
)

df['delta'] = (
    df.apply(lambda x: x.value - d.get((x.group,x.color), x.value), axis=1)
)

или

df['delta'] = (
    df.apply(lambda x: x.value - 
             df.loc[(df.group==x.group) & (df.color==x.color) & (df.num==5)].iloc[0].value, 
             axis=1)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...