如何在Pandas中按组并基于条件应用ffill()填充方法
条件性按组填充DataFrame的close列(仅当day列为None时)
需求:仅当DataFrame的day列值为None时,对close列按name分组后使用ffill()填充前值。
示例数据
import pandas as pd import numpy as np df = pd.DataFrame({ "name": ['AAPL','AAPL','AAPL','AAPL','AAPL','AAPL','MSFT','MSFT','MSFT','MSFT','MSFT','MSFT'], "day": [None,'Fri', None, None, 'Mon', 'Thue', None,'Fri', None, None, 'Mon', 'Thue'], "close": [np.nan, 174.49, np.nan, np.nan, 175.84, np.nan, np.nan, 128.11, np.nan, np.nan, 128.93, np.nan] })
原始DataFrame输出:
name day close 0 AAPL None NaN 1 AAPL Fri 174.49 2 AAPL None NaN 3 AAPL None NaN 4 AAPL Mon 175.84 5 AAPL Thue NaN 6 MSFT None NaN 7 MSFT Fri 128.11 8 MSFT None NaN 9 MSFT None NaN 10 MSFT Mon 128.93 11 MSFT Thue NaN
期望结果
name day close 0 AAPL None NaN 1 AAPL Fri 174.49 2 AAPL None 174.49 # day为None时填充前值 3 AAPL None 174.49 # day为None时填充前值 4 AAPL Mon 175.84 5 AAPL Thue NaN 6 MSFT None NaN 7 MSFT Fri 128.11 8 MSFT None 128.11 # day为None时填充前值 9 MSFT None 128.11 # day为None时填充前值 10 MSFT Mon 128.93 11 MSFT Thue NaN
解决方案
通过先按组完成向前填充,再利用条件判断仅替换符合要求的行,代码如下:
# 按name分组对close列执行向前填充 filled_close = df.groupby('name')['close'].ffill() # 仅将day列为None的行的close值替换为填充后的值,其余保持原样 df['close'] = np.where(df['day'].isna(), filled_close, df['close'])
执行后即可得到符合期望的结果。
内容的提问来源于stack exchange,提问作者user3685918
相关产品推荐
相关产品推荐

