簡體   English   中英

在熊貓數據框列中查找最高值的更有效方法

[英]More efficient way to find top values in pandas dataframe column

我有一個帶有兩列 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

你可以這樣做:

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

所以這個groupby在 'x' 列上並返回最后 2 個值,假設 df 已經按您顯示的方式排序。 這會產生一個具有多重索引的 df,並且第二級值可用於通過使用get_level_values索引回原始 df

編輯

要回答您的評論,您可以再次groupby並使用transform with rank將值重置為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

如果您的數據框未排序,這是一個解決方案:

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不能應用於分組數據幀,因此需要重新格式化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM