Pandas 熊猫多个“分组依据”和对值的操作
A有一个数据集Pandas 熊猫多个“分组依据”和对值的操作,pandas,group-by,Pandas,Group By,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分组的值之间应用算术运算。 感谢您的建议您可以使用.groupby和.diff计算groupby之后的差
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计算groupby之后的差值
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
您还可以添加一个指示符,该指示符显示np.where的差异是否大于0,在此之前,我们使用.reset_索引返回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
我想你需要
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
结果
ID2 p r diff
ID
1 19 5 14
2 7 13 -6
您的数据:
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
非常感谢你们的建议!我快到了…: 我试过所有的密码。 我想我在解释我想要的输出时不清楚。我认为对于我正在处理的实际案例,在下面这样的原始列表中添加一个或两个额外的变量会很有用。这允许我在下面的步骤中对具有负差异的ID做出决定
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)
这是一个简洁的解决方案,但如果var2中有其他值需要比较,则会失败。我相信您需要将aggfunc='sum'设置为pivot_表。pivot_表中的默认函数是mean,O.P.需要sumAdded aggfunc='sum',如@TerryTank you所述,以便应用pivot运算符。我从来没有在熊猫身上用过!很高兴知道。格雷蒂认为你应该进一步澄清这个问题。您是只想分组,还是想同时在列和分组之间进行算术运算?同意。我将在下面解释
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)