传播groupby聚合的结果

时间:2014-04-10 00:12:25

标签: python pandas

说我有以下DataFrame

                       X         Y
A    B      C                    
bar  one    P   0.630667  1.457555
     three  Q   1.163132 -0.944378
            T   0.423349  0.432508
flux six    P  -1.055297 -0.419939
     three  T   2.064113  0.465885
foo  five   Q   0.271349  0.472808
            S  -0.985560 -0.301500
            P  -0.482336 -0.089823
            R   0.745047 -0.713639

我需要在C具有最高值的B的每个值中标识级别X的值,并将其传播回每一行。

结果应为:

                       X         Y  W
A    B      C                    
bar  one    P   0.630667  1.457555  P
     three  Q   1.163132 -0.944378  Q
            T   0.423349  0.432508  Q
flux six    P  -1.055297 -0.419939  P
     three  T   2.064113  0.465885  T
foo  five   Q   0.271349  0.472808  R
            S  -0.985560 -0.301500  R
            P  -0.482336 -0.089823  R
            R   0.745047 -0.713639  R

我该怎么做?

到目前为止,我有以下几点:

df.groupby(level=['A', 'B']).agg(lambda x: x.max())

但我不知道如何宣传"宣传"将结果下移到原始行。

2 个答案:

答案 0 :(得分:2)

如果我了解你,你可以transform组合idxmax(这是"传播下来"部分,尽管我总是把它想象为广播):>>> df["W"] = df.groupby(level=["A", "B"])["X"].transform(lambda x: x.idxmax()[2]) >>> df X Y W A B C bar one P 0.630667 1.457555 P three Q 1.163132 -0.944378 Q T 0.423349 0.432508 Q flux six P -1.055297 -0.419939 P three T 2.064113 0.465885 T foo five Q 0.271349 0.472808 R S -0.985560 -0.301500 R P -0.482336 -0.089823 R R 0.745047 -0.713639 R [9 rows x 3 columns]

{{1}}

答案 1 :(得分:1)

想要一个不使用transform的人?

In [101]:

df2=pd.DataFrame(df.groupby(level=['A', 'B'])['X'].agg(np.argmax).apply(lambda x: x[-1]))
#or pd.DataFrame(df.groupby(level=['A', 'B'])['X'].agg(lambda x: x.idxmax()[-1]))
df['W']=df2.loc[df.index.droplevel(2)].values
In [102]:

print df
                     X         Y  W
A    B     C                       
bar  one   P  0.630667  1.457555  P
     three Q  1.163132 -0.944378  Q
           T  0.423349  0.432508  Q
flux six   P -1.055297 -0.419939  P
     three T  2.064113  0.465885  T
foo  five  P -0.482336 -0.089823  Q
           Q  0.271349  0.472808  Q
           R -0.745047 -0.713639  Q
           S -0.985560 -0.301500  Q

[9 rows x 3 columns]

很容易得到这个部分,     在[115]:

print pd.DataFrame(df.groupby(level=['A', 'B'])['X'].agg(lambda x: x.idxmax()[-1]))
            X
A    B       
bar  one    P
     three  Q
flux six    P
     three  T
foo  five   Q

[5 rows x 1 columns]

但并不是像'W'

那样将其分配回来