我是 python 的新手,我有一個關于如何過濾掉不包含任何女性案例的組(按 'date' 分組)的問題。假設我有一個如下的資料框:
import pandas as pd
import numpy as np
exam_data = {
'date': ['2000-1', '2000-1', '2000-1', '2000-2', '2000-2', '2000-3', '2000-4', '2000-4', '2000-5', '2000-5','2000-5'],
'sex': ['M', 'M', 'F', 'M', 'M', 'F', 'M', 'M', 'F', 'F', 'M'],
'qualify': ['yes', 'no', 'yes', 'no', 'no', 'yes', 'yes', 'no', 'no', 'yes', 'no']}
df_exam = pd.DataFrame(exam_data)
我試過這似乎是正確的,但我覺得它太具體了,因為我使用的字串包含“F”:
df_filter = df_exam.groupby("date").filter(lambda gr: gr["sex"].str.contains("F").any())
有沒有比這更有效的其他演算法,或者比這更多的練習?
非常感謝您的評論。
uj5u.com熱心網友回復:
為了獲得更好的性能,永遠不要使用filter,更好的是通過GroupBy.transform使用掩碼和過濾器創建布爾掩碼boolean indexing:
df_filter = df_exam[df_exam["sex"].eq("F").groupby(df_exam["date"]).transform('any')]
或替代與也不錯,取決于資料的,如果像好transform-讓所有date的條件和過濾S INboolean indexing具有Series.isin:
dates = df_exam.loc[df_exam["sex"].eq("F"), 'date'].unique()
df_filter = df_exam[df_exam["date"].isin(dates)]
uj5u.com熱心網友回復:
測驗是驗證演算法是否更有效的明確方法;但是,一目了然,如果您可以避免匿名函式(lambda),理論上您應該獲得更高的性能:
df_exam.loc[df_exam.sex.eq('F').groupby(df_exam.date).transform('any')]
Out[32]:
date sex qualify
0 2000-1 M yes
1 2000-1 M no
2 2000-1 F yes
5 2000-3 F yes
8 2000-5 F no
9 2000-5 F yes
10 2000-5 M no
上面的代碼是將一個系列按另一個系列分組(在分組之前,熊貓索引對齊在這里開始);所述transform保持結果作為相同的長度與原始資料幀
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/345070.html
標籤:Python 熊猫 pandas-groupby 过滤
