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
那么简单!