У меня есть набор данных
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. Спасибо за любые предложения
Согласен. я объясню ниже

Вы можете использовать .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
Это изящное решение, но оно потерпит неудачу, если в var2 будут другие значения между теми, кто хочет сравнить.
Я думаю, тебе нужно
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
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
Я считаю, что вам нужно установить aggfunc='sum' в сводную_таблицу. Функция по умолчанию в сводной_таблице — mean, OP нужно sum
Добавлен aggfunc='sum', как отметил @Terry.
Спасибо за идею применить оператор пивота. Я никогда не использовал его в пандах! Хорошо знать. Здорово
Ваши данные:
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
Большое спасибо, ребята, за все ваши предложения! Я почти на месте...:) Я пробовал все коды. Я думаю, что я не был ясен, когда объяснял, какой результат я хочу. Я думаю, что для практического случая, над которым я работаю, было бы полезно добавить одну или две дополнительные переменные в исходный список, как это (ниже). Это позволяет мне принимать решения относительно идентификаторов с отрицательными различиями на следующих шагах.
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
Я думаю, что сделал это с вашей помощью. Большое спасибо! Ты обалденный
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)
Я думаю, вам следует немного уточнить вопрос. Вы хотите просто «Группировать по» или хотите выполнять арифметические операции между столбцами и группировать по одновременно?