在groupby元素上使用'bfill'或'ffill'是微不足道的,但如果你需要根据第三列中的条件在第二列中用特定值填充na呢?
例如:
>>> df=pd.DataFrame({'date':['01/10/2017', '02/09/2017', '02/10/2016','01/10/2017', '01/11/2017', '02/10/2016'], 'a':[1,1,1,2,2,2], 'b':[4,np.nan,6, 5, np.nan, 7]})
>>> df
a b date
0 1 4.0 01/10/2017
1 1 NaN 02/09/2017
2 1 6.0 02/10/2016
3 2 5.0 01/10/2017
4 2 NaN 01/11/2017
5 2 7.0 02/10/2016
我需要按列'a'进行分组,并使用列'b'值填充NaN,其中该行的日期最接近NaN行中的日期。
所以输出应该如下:
a b date
0 1 4.0 01/10/2017
1 1 6.0 02/09/2017
2 1 6.0 02/10/2016
3 2 5.0 01/10/2017
4 2 5.0 01/11/2017
5 2 7.0 02/10/2016
假设有一个nearest_date()函数,它接受NaN日期和该组中其他日期的列表,并返回最接近的日期。
我正在尝试找到一个不必遍历行的干净解决方案,理想情况下可以将apply()与lambdas一起使用。有什么想法吗?
答案 0 :(得分:0)
这应该有效:
df['closest_date_by_a'] = df.groupby('a')['date'].apply(closest_date)
df['b'] = df.groupby(['a', 'closest_date_by_a'])['b'].ffill().bfill()
给定一个函数(closest_date()
),您需要按组应用该函数,以便计算每个组中行的最接近日期。然后,您可以按主要分组列(a
)和最近的日期列(closest_date_by_a
)进行分组,然后执行填充。
答案 1 :(得分:0)
确保您的+
列实际上是日期。
^[_.][0-9]+[a-zA-Z]*_*$
在date
df = pd.DataFrame(
{'date': ['01/10/2017', '02/09/2017', '02/10/2016','01/10/2017', '01/11/2017', '02/10/2016'],
'a':[1,1,1,2,2,2], 'b':[4,np.nan,6, 5, np.nan, 7]})
df.date = pd.to_datetime(df.date)
print(df)
a b date
0 1 4.0 2017-01-10
1 1 NaN 2017-02-09
2 1 6.0 2016-02-10
3 2 5.0 2017-01-10
4 2 NaN 2017-01-11
5 2 7.0 2016-02-10
与reindex
一起使用
method='nearest'