簡體   English   中英

Python Pandas - 過濾 pandas dataframe 以獲取一列中具有最小值的行,以獲取另一列中的每個唯一值

[英]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']})

df 的圖片(抱歉還沒有足夠的聲譽)

這就是我想要結束的:

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']})

df1的圖片

注意:我希望每個“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.

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