【发布时间】:2017-08-21 21:25:18
【问题描述】:
我需要在组内的数据框列中转发填充值。我应该注意,组中的第一个值不会因构造而丢失。我目前有以下解决方案。
df = pd.DataFrame({'a': [1,1,2,2,2], 'b': [1, np.nan, 2, np.nan, np.nan]})
# desired output
a b
1 1
1 1
2 2
2 2
2 2
这是我目前尝试过的三种解决方案。
# really slow solutions
df['b'] = df.groupby('a')['b'].transform(lambda x: x.fillna(method='ffill'))
df['b'] = df.groupby('a')['b'].fillna(method='ffill')
# much faster solution, but more memory intensive and ugly all around
tmp = df.drop_duplicates('a', keep='first')
df.drop('b', inplace=True, axis=1)
df = df.merge(tmp, on='a')
所有这三个都产生了我想要的输出,但是前两个在我的数据集上花费了很长时间,第三个解决方案更占用内存并且感觉相当笨重。还有其他方法可以向前填充列吗?
【问题讨论】:
-
您的真实数据是否像示例数据那样按组排序?如果是这样,您应该能够只使用常规的
ffill,因为您在组中的第一个值始终存在,即df['b'] = df['b'].ffill()。 -
哇。我完全错过了。排序后速度很快。谢谢@root!
标签: python pandas missing-data