您可以说,有很多空白。我想向前传播非null值(例如,在第一行 1029 进入 1963.02.12 列,在 1029 和 1043 ),但直到最后一个条目为止,也就是说,当遇到最后一个非null值时,它应该停止传播(对于D,它将是 (1992.03.23列),但对于A,则为1963.09.21,就在屏幕截图之外)。
是否有一种更快捷的方法来实现这一目标而又不必摆弄df.fillna(method='ffill', limit=x)
?我的最初想法是记住上一个条目的日期,将值传播到行的末尾,然后在保存的日期之后用空值填充行。我一直在想是否有一个更聪明的方法来达到相同的结果。
答案 0 :(得分:1)
这可能不是很出色。我无法获得纯熊猫解决方案(这显然不能保证性能!)
>>> df
a b c d e
0 0.0 NaN NaN 1.0 NaN
1 0.0 1.0 NaN 2.0 3.0
2 NaN 1.0 2.0 NaN 4.0
如果我们仅ffill
一切都会发生什么?
>>> df.ffill(axis=1)
a b c d e
0 0.0 0.0 0.0 1.0 1.0
1 0.0 1.0 1.0 2.0 3.0
2 NaN 1.0 2.0 2.0 4.0
我们需要返回并为每行的最后一个空列添加NaN:
>>> new_data = []
>>> for _, row in df.iterrows():
... new_row = row.ffill()
... null_columns = [col for col, is_null in zip(row.index, row.isnull().values) if is_null]
... # replace value in last column with NaN
... if null_columns:
... last_null_column = null_columns[-1]
... new_row.ix[last_null_column] = np.nan
... new_data.append(new_row.to_dict())
...
>>> new_df = pd.DataFrame.from_records(new_data)
>>> new_df
a b c d e
0 0.0 0.0 0.0 1.0 NaN
1 0.0 1.0 NaN 2.0 3.0
2 NaN 1.0 2.0 NaN 4.0