Groupby Pandas生成具有条件的多个字段

时间:2018-01-11 00:44:59

标签: python pandas pandas-groupby

我有一个pandas数据帧:

df = pandas.DataFrame( { 
    "Label" : ["A", "A", "B", "B", "C" , "C"] , 
    "Value" : [1, 9, 1, 1, 9, 9],
    "Weight" : [2, 4, 6, 8, 10, 12} )

我想按'标签'对数据进行分组,并生成2个字段。

  • 如果值== 1
  • ,则第一个字段'newweight'将加权
  • 第二个字段,'weightvalue'将总和Weight * Value

所以我将留下以下数据框:

Label     newweight     weightvalue
 A           2               38
 B           14              14
 C           0               198

我已经查看了pandas groupby()函数,但是在使用它生成2个字段时遇到了麻烦。

3 个答案:

答案 0 :(得分:4)

使用groupby.apply,您可以:

df.groupby('Label').apply(
  lambda g: pd.Series({
    "newweight": g.Weight[g.Value == 1].sum(),
    "weightvalue": g.Weight.mul(g.Value).sum()
})).fillna(0)

#       newweight  weightvalue
#Label
#A            2.0         38.0
#B           14.0         14.0
#C            0.0        198.0

答案 1 :(得分:3)

pd.DataFrame({'Label':df.Label.unique(),'newweight':df.groupby('Label').apply(lambda x : sum((x.Value==1)*x.Weight)).values,'weightvalue':df.groupby('Label').apply(lambda x : sum(x.Value*x.Weight)).values})
Out[113]: 
  Label  newweight  weightvalue
0     A          2           38
1     B         14           14
2     C          0          198

答案 2 :(得分:2)

<强>快速
使用Numpy的bincount超级复杂但非常酷的方法。可能非常快。

v = df.Value.values
w = df.Weight.values
p = v * w
f, u = pd.factorize(df.Label.values)

pd.DataFrame(dict(
    newweight=np.bincount(f, p).astype(int),
    weightvalue=np.bincount(f, p * (v == 1)).astype(int)
), pd.Index(u, name='Label'))

       newweight  weightvalue
Label                        
A             38            2
B             14           14
C            198            0

广告
使用pd.DataFrame.eval

e = """
newweight = Value * Weight
weightvalue = newweight * (Value == 1)
"""
df.set_index('Label').eval(e).iloc[:, -2:].sum(level=0)

       newweight  weightvalue
Label                        
A             38            2
B             14           14
C            198            0