【问题标题】:More efficient way to find top values in pandas dataframe column在熊猫数据框列中查找最高值的更有效方法
【发布时间】:2023-03-28 18:00:01
【问题描述】:

我有一个包含两列 x 和 y 的 df。 y 列是 x 值的累积计数。 x 值具有不同的计数。如何在不遍历行的情况下获得每个 x 的前两个 y 计数的结果 df。

示例 df:

df = pd.DataFrame({"x": [101, 101, 101, 101, 201, 201, 201, 405, 405], "y": [1, 2, 3, 4, 1, 2, 3, 1, 2]})

     x  y
0  101  1
1  101  2
2  101  3
3  101  4
4  201  1
5  201  2
6  201  3
7  405  1
8  405  2

想要的结果:

x      y
101    3
101    4
201    2
201    3
405    1
405    2

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

你可以这样做:

In [35]:
df.loc[df.groupby(['x'])['y'].apply(lambda x: x.iloc[-2:]).index.get_level_values(1)]

Out[35]:
     x  y
2  101  3
3  101  4
5  201  2
6  201  3
7  405  1
8  405  2

因此,'x' 列上的 groupby 并返回最后 2 个值,假设 df 已按您显示的那样排序。这会产生一个具有多重索引的 df,第二级值可用于通过使用 get_level_values

来索引回原始 df

编辑

要回复您的评论,您可以再次groupby 并使用transformrank 将值重置为12

In [51]:
df1 = df.loc[df.groupby(['x'])['y'].apply(lambda x: x.iloc[-2:]).index.get_level_values(1)]
df1['y'] = df1.groupby('x')['y'].transform(lambda x: x.rank(method='first'))
df1
​
Out[51]:
     x  y
2  101  1
3  101  2
5  201  1
6  201  2
7  405  1
8  405  2

【讨论】:

  • 谢谢,跟进这个解决方案,我如何将每个唯一 x 的 y 值重置为 1 和 2
  • 在上面拨打reset_index(drop=True)
【解决方案2】:

如果您的数据框未排序,这是一个解决方案:

In [1]: df.groupby('x')['y'].nlargest(2)
Out[1]: 
x     
101  3    4
     2    3
201  6    3
     5    2
405  8    2
     7    1
dtype: int64

很遗憾,nlargest 不能应用于分组数据框,因此需要重新格式化。

【讨论】:

  • 你可以按照我的建议做同样的事情,在索引上调用get_level_values(1) 并使用它来索引到原来的df
猜你喜欢
  • 1970-01-01
  • 2020-07-24
  • 2019-04-11
  • 2019-02-22
  • 1970-01-01
  • 1970-01-01
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多