我很难想象在熊猫中实现这一目标的另一种方法。我的方式“有效”,但速度非常慢。在高层次上,我想这样做:
id
,找到的中值a
。a
与其组中位数之间的差a
缺少/不可用,a
则如果发现的值step 3
小于公差(例如1),则将其覆盖/设置为中位数。这是我的方法:
假设数据帧为df:
df = pd.DataFrame({'id': [1,1,2,2,3], 'a': [1, np.nan, 3, 1, 2], 'b': [np.nan, 6, 5, np.nan, 4], 'c': [4, 1, 2, 3, 3]})
id a b c
0 1 1.0 NaN 4
1 1 NaN 6.0 1
2 2 3.0 5.0 2
3 2 1.0 NaN 3
4 3 2.0 4.0 3
步骤1:
df['median'] = df.groupby(['id'])['a'].transform('median')
第2步:
df['diff'] = abs(df['a'] - df['median'])
步骤3:
df['diff'] = df.groupby(['id'])['diff'].transform('max')
第四步:
for key, g in df.groupby(['id']):
index = (df.id == key) & (df['diff'] < 1.0) & (df.a.isna())
if not df[index].empty:
df.loc[index, 'a'] = g['median']
我相对相信步骤1-3是正确的,并且以有效的方式完成了(希望在偶代大熊猫中完成)。第4步我不喜欢,我很确定这是瓶颈,而且这似乎是错误的方法。我想不通另一种方法。
在改进第4步中有什么建议(如果有错,则建议1-3,或者可以采取更好的方法)?
编辑:正如您可能已经注意到的,如果您已经做到了这一点,这只是我尝试以特定方式填充缺失值。如果有一种更简单的方法来完成整件事,那么我很烦:)
由于中位数列已经对齐'a'
,因此我认为您根本不需要循环,甚至不需要循环groupby
。
df['a'] = df['median'].where(df['a'].isna() & (df['diff'] < 1), df['a'])
这将在适当的地方采用中位数,否则请使用'a'
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句