Несколько панд "group by" и операции со значениями - PullRequest
0 голосов
/ 04 марта 2019

A имеет набор данных

ID    ID2    var1
 1      p      10
 1      r       5
 1      p       9
 2      p       7
 2      r       6
 2      r       7

Мне нужно подтвердить, что в каждом Nº ID разница между (сумма var1 на «p») и (сумма var1 на «r») равнабольше 0. Другими словами, мне нужно сгруппировать по ID и применить арифметические операции между значениями, сгруппированными по ID2.Спасибо за любые предложения

Ответы [ 6 ]

0 голосов
/ 05 марта 2019

Я думаю, что сделал это с вашей помощью.Спасибо вам большое!Вы потрясающий

import pandas as pd
import numpy as np

df = pd.DataFrame({'id': [23, 23, 23, 43, 43],
                   'id2': ["r", "p", "p", "p", "r"],
                   'var1': [4, 6, 7, 1, 3]})

print(df)

df2 = df.pivot_table(values = "var1", index="id", columns="id2", aggfunc='sum')
df2['diff'] = df2['p'] - df2['r']

df["var_2"]=df['id'].map(df2["diff"])

df['control'] = np.where(df['var_2']<0, 1, 0)
0 голосов
/ 05 марта 2019

Большое спасибо, ребята, за все ваши предложения!Я почти там ... :) Я пробовал все коды.Думаю, мне было непонятно, когда объясняю, какой вывод я хочу.Я думаю, что для практического случая, над которым я работаю, было бы полезно добавить дополнительную переменную или две в исходный список, как этот (ниже). Это позволяет мне принимать решения относительно идентификаторов с отрицательными различиями в следующих шагах.

 output:
 ID    ID2    var1   var2(diff)   var_control
 1      p      10          14              0
 1      r       5          14              0
 1      p       9          14              0
 2      p       7          -6              1
 2      r       6          -6              1
 2      r       7          -6              1
0 голосов
/ 04 марта 2019

Ваши данные:

    import pandas as pd
    df=pd.DataFrame([[1,'p',10], [1,'r',5], [1,'p',9 ],
                        [2,'p',7 ], [2,'r',6 ], [2,'r',7 ]], 
                        columns=['ID', 'ID2', 'var1'])

Вы можете сделать кросс-табуляцию:

    df=pd.crosstab(df.ID, [df.ID2,df.var1], margins=True)

    >>>df

    ID2   p        r       All
    var1  7  9 10  5  6  7    
    ID                        
    1     0  1  1  1  0  0   3
    2     1  0  0  0  1  1   3
    All   1  1  1  1  1  1   6

Без полей:

    pd.crosstab(df.ID, [df.ID2,df.var1])

    ID2   p        r      
    var1  7  9  10 5  6  7 
    ID                    
    1     0  1  1  1  0  0
    2     1  0  0  0  1  1
0 голосов
/ 04 марта 2019
import pandas as pd
from io import StringIO

df = pd.read_fwf(StringIO(
"""ID   ID2    var1
 1      p      10
 1      r       5
 1      p       9
 2      p       7
 2      r       6
 2      r       7""")).set_index("ID")


df2 = df.pivot_table(values = "var1", index="ID", columns="ID2", aggfunc='sum')

# Example operatin -- difference
df2['diff'] = df2['p'] - df2['r']
df2

Результат

ID2   p   r  diff
ID               
1    19   5    14
2     7  13    -6
0 голосов
/ 04 марта 2019

Я думаю, вам нужно

df.groupby(['ID','ID2']).sum().groupby(level=[0]).diff()
Out[174]: 
        var1
ID ID2      
1  p     NaN
   r   -14.0
2  p     NaN
   r     6.0
0 голосов
/ 04 марта 2019

Вы можете использовать .groupby и .diff() для расчета разницы после группового.

df.groupby(['ID', 'ID2']).var1.sum().diff()

Out[72]: 
ID  ID2
1   p       NaN
    r     -14.0
2   p       2.0
    r       6.0
Name: var1, dtype: float64

Вы также можете добавить индикатор, который показывает, была ли разница больше 0 с помощью np.whereперед этим мы используем .reset_index, чтобы вернуть наш var1 столбец.

groupby = df.groupby(['ID', 'ID2']).var1.sum().diff().reset_index()

groupby['indicator'] = np.where(groupby.var1 > 0, 'yes', 'no')

print(groupby)
   ID ID2  var1 indicator
0   1   p   NaN        no
1   1   r -14.0        no
2   2   p   2.0       yes
3   2   r   6.0       yes
...