传播非空值将转发到最后一个条目

时间:2018-12-01 17:21:33

标签: python python-3.x pandas dataframe

我有一个看起来像这样的大数据框: enter image description here

您可以说,有很多空白。我想向前传播非null值(例如,在第一行 1029 进入 1963.02.12 列,在 1029 1043 ),但直到最后一个条目为止,也就是说,当遇到最后一个非null值时,它应该停止传播(对于D,它将是  (1992.03.23列),但对于A,则为1963.09.21,就在屏幕截图之外)。

是否有一种更快捷的方法来实现这一目标而又不必摆弄df.fillna(method='ffill', limit=x)?我的最初想法是记住上一个条目的日期,将值传播到行的末尾,然后在保存的日期之后用空值填充行。我一直在想是否有一个更聪明的方法来达到相同的结果。

1 个答案:

答案 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