在一行中查找所有相同的值并保持另一行的最高绝对值
Posted
技术标签:
【中文标题】在一行中查找所有相同的值并保持另一行的最高绝对值【英文标题】:Find all the same values on a row and keep the highest absolute of another row 【发布时间】:2019-12-20 21:34:02 【问题描述】:我有一个具有这个形状的数据框:
x y
1 1510 -125
2 1636 -125
3 1637 -125
4 1509 -124
5 1510 -124
... ... ...
4210 1555 68
4211 1556 68
4212 1682 68
4213 1554 69
4214 1555 69
我想在 x 上找到所有相同的值,并只保留 y 上绝对值最高的那个。
例如在给定的数据框上:
x y
1 1510 -125
... ... ...
5 1510 -124
... ... ...
4210 1555 68
... ... ...
4214 1555 69
我想保留
x y
1 1510 -125
... ... ...
4214 1555 69
并删除 x 相同 和 y 较低 的其他值。
【问题讨论】:
你觉得highest absolute of another row
吗?
是的。如果我有很多相同的 x,我想保留绝对 y 最高的 x
【参考方案1】:
只有一个绝对最大值的解决方案:
使用DataFrameGroupBy.idxmax
和y
的绝对值作为最大索引,然后通过loc
选择:
df1 = df.loc[df['y'].abs().groupby(df['x']).idxmax()]
print (df1)
x y
1 1510 -125
4214 1555 69
或者:
df1 = df.loc[df.assign(y=df['y'].abs()).groupby('x')['y'].idxmax()]
使用GroupBy.transform
获取所有最大值的解决方案,以获取由绝对值的最大值填充的系列:
print (df)
x y
1 1510 -125
1 1510 -125
5 1510 -124
4210 1555 68
4214 1555 69
y = df['y'].abs()
df1 = df[y.groupby(df['x']).transform('max') == y]
print (df1)
x y
1 1510 -125
1 1510 -125
4214 1555 69
【讨论】:
非常感谢您的解释性回答!【参考方案2】:要获得您想要的确切信息,您可以通过以下方式进行操作:
df['y_abs'] = df['y'].abs() # calculate abs
ind = df[['x','y_abs']].groupby('x').idxmax().to_numpy().flatten() #get indexes of max y_abs
df.drop(columns='y_abs').iloc[ind,:] # get rows with that indexes
输出:
x y
0 1510 -125
3 1555 69
关于找到最大 y
的解决方案
对 DataFrame 使用 groupby 函数很容易:
df = pd.DataFrame('x':[1510, 1510, 1555, 1555], 'y':[-125,-124,68,69])
df.groupby('x').max()
输出:
y
x
1510 -124
1555 69
【讨论】:
@jezrael 你是对的!然后,我的解决方案已经不那么优雅了:) 修复了。 感谢您抽出宝贵的时间和您的解释性回答!以上是关于在一行中查找所有相同的值并保持另一行的最高绝对值的主要内容,如果未能解决你的问题,请参考以下文章