首页 > 解决方案 > 将两列合并为上下填充的单列

问题描述

我有一个数据框来跟踪人与人之间物体的移动。每行都包含对此对象状态的更新,并按时间戳升序排序。

我有两列代表从一个所有者到另一个所有者的状态变化。我想将这些列折叠成一列,表示每个更新行中所有者的“当前状态”。不幸的是,我只得到状态变化,所以我必须能够上下填充。

这是一个示例数据框:

test_df = pd.DataFrame([
    (0, '', ''),
    (1, '', ''),
    (2, 'person1', 'person2'),
    (3, '', ''),
    (4, '', ''),
    (5, 'person2', 'person3'),
    (6, 'person3', 'person4'),
    (7, '', ''),
    (8, '', ''),
], columns = ['entry_id', 'original_owner', 'new_owner'])

这就是我希望它看起来的样子:

entry_id    original_owner   new_owner    current_owner
0                                         person1
1                                         person1
2           person 1         person 2     person2
3                                         person2
4                                         person2
5           person 2         person 3     person3
6           person 3         person 4     person4
7                                         person4
8                                         person4

谢谢!

标签: pythonpython-3.xpandas

解决方案


这是一个.ffillon 'new_owner',有一些额外的填充来获得前几行。因此,我建议让NaNas表示的缺失值''不是 pandas 识别的空值:

import numpy as np

test_df = test_df.replace('', np.NaN)
test_df['current_owner'] = test_df.new_owner.ffill().fillna(test_df.original_owner.bfill())

   entry_id original_owner new_owner current_owner
0         0            NaN       NaN       person1
1         1            NaN       NaN       person1
2         2        person1   person2       person2
3         3            NaN       NaN       person2
4         4            NaN       NaN       person2
5         5        person2   person3       person3
6         6        person3   person4       person4
7         7            NaN       NaN       person4
8         8            NaN       NaN       person4

推荐阅读