在一行中查找所有相同的值并保持另一行的最高绝对值

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.idxmaxy 的绝对值作为最大索引,然后通过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 你是对的!然后,我的解决方案已经不那么优雅了:) 修复了。 感谢您抽出宝贵的时间和您的解释性回答!

以上是关于在一行中查找所有相同的值并保持另一行的最高绝对值的主要内容,如果未能解决你的问题,请参考以下文章

mysql连接具有相同列值的两行并计算某些列值并返回一行中的所有行

如何查找一行不包含另一列中的值

Excel:跨多列查找值并返回标题列

PSQL - 查找所有值并根据另一列中的非唯一值使其唯一

根据另一行中的值更新一行

在R中:如果缺少另一行的值,则替换一行的值