[英]Pandas: More efficient way to update a column in pandas dataframe without a for loop
[英]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
將值重置為1
和2
:
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.