应用 Groupby 后根据不同的列值选择列值
selecting a column value based on a different column value after applying Groupby
我可以让它工作,但在我应用 groupby 之后就不行了。在这个例子中,我只想让最后一列包含 x 列中的最小值。我用一个名为 yminx 的列对 df 进行了 popuymated,这就是我希望我的 abc 列看起来像的样子。我无法将 abc 的值设为本地(在 groupby 之后)最小值。
In [3]:
df
Out[3]:
Symbol x y yminx
0 IBM 12 27 58
1 IBM 1 58 58
2 IBM 13 39 58
3 IBM 4 45 58
4 GS 5 72 44
5 GS 15 54 44
6 GS 20 50 44
7 GS 4 90 44
8 GS 14 39 44
9 GS 2 44 44
10 GS 7 79 44
11 GS 12 27 44
12 GS 11 66 44
df['try']=df.groupby(['Symbol'])['x'].transform('min')
df['cond1'] = df['x'] == min(df['x'])
df['abc']= np.select(df['cond1'],df['y'])
Symbol x y yminx cond1 abc try
0 IBM 12 27 58 False 58 1
1 IBM 1 58 58 True 58 1
2 IBM 13 39 58 False 58 1
3 IBM 4 45 58 False 58 1
4 GS 5 72 90 False 58 2
5 GS 15 54 90 False 58 2
6 GS 20 50 90 False 58 2
7 GS 4 90 90 False 58 2
8 GS 14 39 90 False 58 2
9 GS 2 44 90 False 58 2
10 GS 7 79 90 False 58 2
11 GS 12 27 90 False 58 2
12 GS 11 66 90 False 58 2
在输出中,我看到 58 被选中,这是 IBM 的 nin,但是当我到达 GS 时,相同的最小值被结转,就好像从未引用过 groupby 一样
我确定这只是语法问题,但我被卡住了。
感谢您的帮助
约翰
一种方法是使用最小值的 指数 。例如:
>>> imin = df.groupby("Symbol")["x"].transform("idxmin")
>>> df["yminx"] = df.loc[imin, "y"].values
>>> df
Symbol x y yminx
0 IBM 12 27 58
1 IBM 1 58 58
2 IBM 13 39 58
3 IBM 4 45 58
4 GS 5 72 44
5 GS 15 54 44
6 GS 20 50 44
7 GS 4 90 44
8 GS 14 39 44
9 GS 2 44 44
10 GS 7 79 44
11 GS 12 27 44
12 GS 11 66 44
(需要 values
,因为 df.loc
的结果有自己的索引,我们想忽略它,只关心值。)
我可以让它工作,但在我应用 groupby 之后就不行了。在这个例子中,我只想让最后一列包含 x 列中的最小值。我用一个名为 yminx 的列对 df 进行了 popuymated,这就是我希望我的 abc 列看起来像的样子。我无法将 abc 的值设为本地(在 groupby 之后)最小值。
In [3]:
df
Out[3]:
Symbol x y yminx
0 IBM 12 27 58
1 IBM 1 58 58
2 IBM 13 39 58
3 IBM 4 45 58
4 GS 5 72 44
5 GS 15 54 44
6 GS 20 50 44
7 GS 4 90 44
8 GS 14 39 44
9 GS 2 44 44
10 GS 7 79 44
11 GS 12 27 44
12 GS 11 66 44
df['try']=df.groupby(['Symbol'])['x'].transform('min')
df['cond1'] = df['x'] == min(df['x'])
df['abc']= np.select(df['cond1'],df['y'])
Symbol x y yminx cond1 abc try
0 IBM 12 27 58 False 58 1
1 IBM 1 58 58 True 58 1
2 IBM 13 39 58 False 58 1
3 IBM 4 45 58 False 58 1
4 GS 5 72 90 False 58 2
5 GS 15 54 90 False 58 2
6 GS 20 50 90 False 58 2
7 GS 4 90 90 False 58 2
8 GS 14 39 90 False 58 2
9 GS 2 44 90 False 58 2
10 GS 7 79 90 False 58 2
11 GS 12 27 90 False 58 2
12 GS 11 66 90 False 58 2
在输出中,我看到 58 被选中,这是 IBM 的 nin,但是当我到达 GS 时,相同的最小值被结转,就好像从未引用过 groupby 一样
我确定这只是语法问题,但我被卡住了。
感谢您的帮助
约翰
一种方法是使用最小值的 指数 。例如:
>>> imin = df.groupby("Symbol")["x"].transform("idxmin")
>>> df["yminx"] = df.loc[imin, "y"].values
>>> df
Symbol x y yminx
0 IBM 12 27 58
1 IBM 1 58 58
2 IBM 13 39 58
3 IBM 4 45 58
4 GS 5 72 44
5 GS 15 54 44
6 GS 20 50 44
7 GS 4 90 44
8 GS 14 39 44
9 GS 2 44 44
10 GS 7 79 44
11 GS 12 27 44
12 GS 11 66 44
(需要 values
,因为 df.loc
的结果有自己的索引,我们想忽略它,只关心值。)