Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向下传播groupby聚合的结果_Python_Pandas - Fatal编程技术网

Python 向下传播groupby聚合的结果

Python 向下传播groupby聚合的结果,python,pandas,Python,Pandas,假设我有以下数据帧 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.465

假设我有以下数据帧

                       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
我需要在
B
的每个值中标识
C
级别的值,其中
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())

但是我不知道如何将结果“传播”到原始行。

如果我理解您的意思,您可以将
转换
(这是“传播”部分,尽管我一直认为它是向上广播)与
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]

如果我理解您的意思,您可以将
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]

如果我理解您的意思,您可以将
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]

如果我理解您的意思,您可以将
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]

想要一个不使用
转换的

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”并不像分配回“W”一样困难,您想要一个不使用变换的吗

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”并不像分配回“W”一样困难,您想要一个不使用变换的吗

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”并不像分配回“W”一样困难,您想要一个不使用变换的吗

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”并不像分配回“W”那样困难,谢谢。我特别感兴趣的是一个适用于我在聚合中使用的任何lambda/函数的解决方案(对不起,最大lambda只是为了一个示例)。这对任何lambda都有用吗?谢谢。它确实奏效了。我简直不敢相信它竟然像使用
transform
而不是
lambda
那么简单!谢谢我特别感兴趣的是一个适用于我在聚合中使用的任何lambda/函数的解决方案(对不起,最大lambda只是为了一个示例)。这对任何lambda都有用吗?谢谢。它确实奏效了。我简直不敢相信它竟然像使用
transform
而不是
lambda
那么简单!谢谢我特别感兴趣的是一个适用于我在聚合中使用的任何lambda/函数的解决方案(对不起,最大lambda只是为了一个示例)。这对任何lambda都有用吗?谢谢。它确实奏效了。我简直不敢相信它竟然像使用
transform
而不是
lambda
那么简单!谢谢我特别感兴趣的是一个适用于我在聚合中使用的任何lambda/函数的解决方案(对不起,最大lambda只是为了一个示例)。这对任何lambda都有用吗?谢谢。它确实奏效了。我简直不敢相信它竟然像使用
transform
而不是
lambda
那么简单!