说我有以下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())
但我不知道如何宣传"宣传"将结果下移到原始行。
答案 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'