![](/img/trans.png)
[英]How to pandas groupby one column and filter dataframe based on the minimum unique values of another column?
[英]Python Pandas - filter pandas dataframe to get rows with minimum values in one column for each unique value in another column
這是我正在使用的 DF 的虛擬示例(“ETC”代表幾列):
df = pd.DataFrame(data={'PlotCode':['A','A','A','A','B','B','B','C','C'],
'INVYR':[2000,2000,2000,2005,1990,2000,1990,2005,2001],
'ETC':['a','b','c','d','e','f','g','h','i']})
這就是我想要結束的:
df1 = pd.DataFrame(data={'PlotCode':['A','A','A','B','B','C'],
'INVYR':[2000,2000,2000,1990,1990,2001],
'ETC':['a','b','c','e','g','i']})
注意:我希望每個“PlotCode”的所有行都具有最小“INVYR”值,而不僅僅是一個,否則我假設我可以使用 drop_duplicates 和排序來做一些更容易的事情。
到目前為止,按照此處的答案Appending pandas dataframes generated in a for loop我已經嘗試使用以下代碼:
df1 = []
for i in df['PlotCode'].unique():
j = df[df['PlotCode']==i]
k = j[j['INVYR']==j['INVYR'].min()]
df1.append(k)
df1 = pd.concat(df1)
此代碼有效但速度很慢,我的實際數據包含大約 40,000 個不同的 PlotCodes,因此這不是一個可行的解決方案。 有誰知道這樣做的一些平滑過濾方式? 我覺得我錯過了一些非常簡單的東西。
先感謝您!
使用 pandas 時盡量不要使用 for 循環,與 pandas 具有的矢量化操作相比,它們非常慢。
解決方案 1:
使用.groupby()確定每個 plotcode 的最小 INVYR:
min_invyr_per_plotcode = df.groupby('PlotCode', as_index=False)['INVYR'].min()
並使用pd.merge()在您的原始 df 與您剛剛找到的最小值之間進行內部連接:
result_df = pd.merge(
df,
min_invyr_per_plotcode,
how='inner',
on=['PlotCode', 'INVYR'],
)
解決方案 2:
再次確定每組的最小值,但現在將其作為列添加到您的 dataframe。使用.groupby().transform()將每組的最小值添加到每一行
df['min_per_group'] = (df
.groupby('PlotCode')['INVYR']
.transform('min')
)
現在過濾您的 dataframe,其中一行中的 INVYR 等於該組的最小值:
df[df['INVYR'] == df['min_per_group']]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.