使用用户定义的函数或向量化函数替代项优化Groupby.apply()

时间:2019-07-04 00:49:00

标签: pandas numpy apply pandas-groupby

我正在尝试优化或避免使用用户定义函数并将其应用于每个ID的pandas Groupby.apply()方法

熊猫版本:0.23.4

初始数据框

ID    Val1   Val2  Val3
1111  2      2      3
1111  NAN    9     10
1111  NAN    7      4
2222  NAN    2      3
2222  3      2      3
3333  6    NAN      5
3333  NAN    2      3

我在ID级别进行分组,并调用操作用户定义功能的应用功能

df_dedup = df.groupby('ID').apply(lambda x : my_func(data = x))

我的函数my_func通过选择具有最高非缺失值的ID来删除ID级别的重复项。
如果非缺失值的数量相同(例如ID 3333),那么我会随机选择一个。

ID    Val1   Val2  Val3
1111  2      2      3  (This will be picked, highest non-missing ID)
1111  NAN    9     10
1111  NAN    7      4

2222  NAN    2      3
2222  3      2      3 (This will be picked, highest non-missing ID)

3333  6    NAN      5
3333  NAN    2      3 (Random Pick)

apply()方便地汇总所有3个ID,结果数据帧为

Final De-duped Dataframe 

ID    Val1   Val2  Val3
1111  2      2     3
2222  3      2     3
3333  NAN    2     3

现在, 不使用groupby.apply()或apply()怎么办? 还有其他选择吗?

它永远运行 1百万条记录运行了约20分钟

1 个答案:

答案 0 :(得分:1)

在此过程中,根据您的条件,将数据帧一分为二,一个对所有行都具有nan或某些行不包含nan,然后我们将它们区别对待。

s1=df.isnull().any(1).groupby(df['ID']).transform('all')
df1=df[s1];df2=df[~s1]
df1=df1.sort_values(['Val3']).drop_duplicates('ID',keep='last')
df2=df2.groupby('ID').apply(pd.DataFrame.sample,n=1).reset_index(level=0,drop=True)
df=pd.concat([df1,df2]).sort_index()
df
Out[178]: 
     ID Val1 Val2  Val3
0  1111    2    2     3
4  2222    3    2     3
5  3333    6  NaN     5