Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用最接近缺失值日期的值填充缺失值_Python_Pandas_Missing Data - Fatal编程技术网

Python 使用最接近缺失值日期的值填充缺失值

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',

我知道如何使用带有ffill或bfill的groupby方法来插补缺少的值。但我这里的问题是,我需要首先在“日期”列中找到与“分数”列中的空值最近的日期,如果分数列中的值不是空的,则使用该值对其进行插补。如果该值为空,我需要搜索另一个最近的日期。我可以遍历行并执行它,但速度非常慢

这是数据的一个示例:

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