python - 填充空值直到 Pandas 中的特定列值

标签 python pandas

我有以下时间序列数据框。我想用以前的值填充缺失值。但是我只想填充缺失值,直到达到某个值。该值记录在不同的列中。所以我想填写的列每一行都会不同。我该怎么做?

所以,给定这个数据框。

import numpy as np
import pandas as pd
df = pd.DataFrame([[1, 2 ,np.nan,np.nan,np.nan , 2009], [1, 3 , np.nan , np.nan , np.nan , 2010], [4, np.nan , 7 , np.nan,np.nan , 2011]], columns=[2007,2008,2009,2010,2011 , fill_until])

输入数据框

2007    2008    2009    2010    2011  fill_until 
 1       2       NaN    NaN     NaN   2009
 1       3       NaN    NaN     NaN   2010
 4       Nan     7      NaN     NaN   2011    

输出数据框:

2007    2008    2009    2010    2011
 1       2       2      NaN      NaN
 1       3       3        3      NaN
 4       4       7        7        7

最佳答案

使用ffill + where -

m = df.columns[:-1].values <= df.fill_until.values[:, None]
df.iloc[:, :-1].ffill(axis=1).where(m)

   2007  2008  2009  2010  2011
0   1.0   2.0   2.0   NaN   NaN
1   1.0   3.0   3.0   3.0   NaN
2   4.0   4.0   7.0   7.0   7.0

详情

根据 fill_until 列,使用 NumPy 的广播获取要填充的值的掩码。

m = df.columns[:-1].values <= df.fill_until.values[:, None]

或者,

m = (df.columns[:-1].values[:, None] <= df.fill_until.values).T

m    
array([[ True,  True,  True, False, False],
       [ True,  True,  True,  True, False],
       [ True,  True,  True,  True,  True]], dtype=bool)

现在,切掉除最后一列以外的所有列,并沿第一个轴调用 ffill -

i = df.iloc[:, :-1].ffill(axis=1)
i

   2007  2008  2009  2010  2011
0   1.0   2.0   2.0   2.0   2.0
1   1.0   3.0   3.0   3.0   3.0
2   4.0   4.0   7.0   7.0   7.0

现在,使用先前计算的掩码 m 来使用 df.where 掩码 i 的值 -

i.where(m)

   2007  2008  2009  2010  2011
0   1.0   2.0   2.0   NaN   NaN
1   1.0   3.0   3.0   3.0   NaN
2   4.0   4.0   7.0   7.0   7.0

或者,使用mask,反转m -

i.mask(~m)

   2007  2008  2009  2010  2011
0   1.0   2.0   2.0   NaN   NaN
1   1.0   3.0   3.0   3.0   NaN
2   4.0   4.0   7.0   7.0   7.0

关于python - 填充空值直到 Pandas 中的特定列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48090128/

相关文章:

python-3.x - 为什么 pandas 自己将 dataframe 中的 int 值转换为 float 值?

python - 如何循环具有多个输入的函数?

python - 奇怪的字典调用?

python - 识别 pandas 中具有稀疏 nan 的时间序列中的数据组

python-3.x - python : SettingWithCopyWarning when trying to set value to True based on condition

python - 我是否正确地将傅里叶变换应用于此数据框? [EXAFS X 射线吸收数据框]

将日期向量转换为范围的 Pythonic 方法?

javascript - 通过javascript在cmd(Windows)上运行python脚本

python - 解释相机校准结果?

python - 是否可以在 numpy 数组切片运算符中组合逻辑条件和限制条件