我正在尝试优化或避免使用用户定义函数并将其应用于每个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分钟
答案 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