Python 使用最接近缺失值日期的值填充缺失值
我知道如何使用带有ffill或bfill的groupby方法来插补缺少的值。但我这里的问题是,我需要首先在“日期”列中找到与“分数”列中的空值最近的日期,如果分数列中的值不是空的,则使用该值对其进行插补。如果该值为空,我需要搜索另一个最近的日期。我可以遍历行并执行它,但速度非常慢 这是数据的一个示例:Python 使用最接近缺失值日期的值填充缺失值,python,pandas,missing-data,Python,Pandas,Missing Data,我知道如何使用带有ffill或bfill的groupby方法来插补缺少的值。但我这里的问题是,我需要首先在“日期”列中找到与“分数”列中的空值最近的日期,如果分数列中的值不是空的,则使用该值对其进行插补。如果该值为空,我需要搜索另一个最近的日期。我可以遍历行并执行它,但速度非常慢 这是数据的一个示例: df = pd.DataFrame( {'cn': [1, 1, 1, 1, 2, 2, 2], 'date': ['01/10/2017', '02/09/2016',
df = pd.DataFrame(
{'cn': [1, 1, 1, 1, 2, 2, 2],
'date': ['01/10/2017', '02/09/2016', '02/10/2016','01/20/2017', '05/15/2019', '02/10/2016', '02/10/2017'],
'score': [np.nan, np.nan, 6, 5, 4, np.nan, 8]})
cn date score
0 1 01/10/2017 NaN
1 1 02/09/2016 NaN
2 1 02/10/2016 6
3 1 01/20/2017 5
4 2 05/15/2019 4
5 2 02/10/2016 NaN
6 2 02/10/2017 8.0
输出应该是
cn date score
0 1 01/10/2017 5
1 1 02/09/2016 6
2 1 02/10/2016 6
3 1 01/20/2017 5
4 2 05/15/2017 4
5 2 02/10/2016 8
6 2 02/10/2018 8
我如何使用groupby方法和apply函数来实现它 使用
pd.merge\u asof
获得最接近匹配的序列,然后只使用.fillna
。有一些操作,以确保事情最终在索引上对齐
import pandas as pd
df['date'] = pd.to_datetime(df.date)
s = (pd.merge_asof(
df.sort_values('date').reset_index(), # Full Data Frame
df.sort_values('date').dropna(subset=['score']), # Subset with valid scores
by='cn', # Only within `'cn'` group
on='date', direction='nearest' # Match closest date
)
.set_index('index')
.score_y)
df['score'] = df.score.fillna(s, downcast='infer')
输出:df
@阿洛伊兹,谢谢你的时间。(subset=['score'])表示您根据分数对数据进行分组?@Mary否,这里没有分组。它是整个数据帧与自身子集的合并,其中score不为null。
by='cn'
确保合并只发生在'cn'
的相同值内,如果根据“最近”日期匹配,则合并发生在每个组内。因为我们从用于合并的右侧数据框中删除了空值,所以结果是与“cn”相同且分数不丢失的最近日期相匹配。@ALoIIz,再次感谢。为了确保这一点,我必须使用“cn”列对数据进行分组。一组中“分数”列中的值不能转移到另一组。您的代码没有这样做,是吗?@Mary是的,这由by
参数负责。合并确保了第一次的精确匹配(因此本质上这是在“cn”组中)。然后,一旦完成了精确匹配,它将根据on
条件查找最接近的匹配项。你可以在ALoIIz看到比你更多的例子。成功了。你能告诉我什么是“分数”吗?
cn date score
0 1 2017-01-10 5
1 1 2016-02-09 6
2 1 2016-02-10 6
3 1 2017-01-20 5
4 2 2019-05-15 4
5 2 2016-02-10 8
6 2 2017-02-10 8