python - 将非空值向前传播到最后一个条目

标签 python python-3.x pandas dataframe

我有一个看起来与此类似的大型数据框: enter image description here

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

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

最佳答案

这可能性能不是很好。我无法获得纯 Pandas 解决方案(这显然不能保证性能!)

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

如果我们填充所有内容会发生什么?

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

关于python - 将非空值向前传播到最后一个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53573260/

相关文章:

python - 将多个 if 和 elif 语句应用于 for 循环中字符串列表中的子字符串

Python:嵌套字典与元组键(调用前者要快得多)

linux - 使用python捕获Linux中运行程序的屏幕截图

python - 如何将Python pandas数据保存到Excel文件中?

python - 如何从分区 DF(非唯一索引)中选择带有索引列表的数据?

python - 使用 Python 的字符串子序列内核和 SVM

python - 在 400K Pandas 数据框中添加随机日期

python - 根据现有列下一行的元素创建新列

python - 如何在要抓取的 url 列表中安全地执行多线程?

python - 使用 pyinstaller 制作的 exe 文件被 Windows Defender 报告为病毒威胁