根据多个“优先级”列更新单个列

时间:2017-07-04 13:19:58

标签: python-3.x pandas

假设您有一个包含多个列/系列的DataFrame,例如五个。如果第五列(名为“Updated Col”)具有值,除了nans之外,根据首选列顺序从其他列中替换nans将值插入“Updated Col”的最佳方法是什么?

e.g。我的数据框看起来像这样;

Date                 1     2    3   4   Updated Col
12/03/2017 0:00     0.4                 0.9
12/03/2017 0:10     0.4                 0.1
12/03/2017 0:20     0.4                 0.6
12/03/2017 0:30     0.9   0.7           Nan
12/03/2017 0:40     0.1                 Nan
12/03/2017 0:50     0.6            0.5  Nan
12/03/2017 1:00     0.4        0.3      Nan
12/03/2017 1:10     0.3            0.2  Nan
12/03/2017 1:20     0.9                 0.8
12/03/2017 1:30     0.9                 0.8
12/03/2017 1:40     0.0                 0.9

..并举例说我希望第3列的值为优先级,然后是2,然后是1,我希望DataFrame看起来像这样;

                  1    2      3   4   Updated Col
12/03/2017 0:00  0.4                  0.9
12/03/2017 0:10  0.4                  0.1
12/03/2017 0:20  0.4                  0.6
12/03/2017 0:30  0.9  0.7             0.7
12/03/2017 0:40  0.1                  0.1
12/03/2017 0:50  0.6             0.5  0.5
12/03/2017 1:00  0.4        0.3       0.3
12/03/2017 1:10  0.3             0.2  0.2
12/03/2017 1:20  0.9                  0.8
12/03/2017 1:30  0.9                  0.8
12/03/2017 1:40  0.0                  0.9
仅当优先级较高的列为空/ NaN时,才会从较低优先级列输入

..值。

最好的方法是什么?

我尝试了很多np.where尝试,但无法找出最好的方法是什么?

非常感谢提前。

1 个答案:

答案 0 :(得分:2)

您可以使用fillna进行前向填充(ffill),然后选择列:

updated_col =  'Updated Col'
#define columns for check, maybe [1,2,3,4] if integer colum names
cols = ['1','2','3','4'] + [updated_col]

print (df[cols].ffill(axis=1))
      1    2    3    4  Updated Col
0   0.4  0.4  0.4  0.4          0.9
1   0.4  0.4  0.4  0.4          0.1
2   0.4  0.4  0.4  0.4          0.6
3   0.9  0.9  0.7  0.7          0.7
4   0.1  0.1  0.1  0.1          0.1
5   0.6  0.6  0.6  0.5          0.5
6   0.4  0.4  0.3  0.3          0.3
7   0.3  0.3  0.3  0.2          0.2
8   0.9  0.9  0.9  0.9          0.8
9   0.9  0.9  0.9  0.9          0.8
10  0.0  0.0  0.0  0.0          0.9

df[updated_col] = df[cols].ffill(axis=1)[updated_col]
print (df)
               Date    1   2    3    4  Updated Col
0   12/03/2017 0:00  0.4 NaN  NaN  NaN          0.9
1   12/03/2017 0:10  0.4 NaN  NaN  NaN          0.1
2   12/03/2017 0:20  0.4 NaN  NaN  NaN          0.6
3   12/03/2017 0:30  0.9 NaN  0.7  NaN          0.7
4   12/03/2017 0:40  0.1 NaN  NaN  NaN          0.1
5   12/03/2017 0:50  0.6 NaN  NaN  0.5          0.5
6   12/03/2017 1:00  0.4 NaN  0.3  NaN          0.3
7   12/03/2017 1:10  0.3 NaN  NaN  0.2          0.2
8   12/03/2017 1:20  0.9 NaN  NaN  NaN          0.8
9   12/03/2017 1:30  0.9 NaN  NaN  NaN          0.8
10  12/03/2017 1:40  0.0 NaN  NaN  NaN          0.9

编辑:

感谢shivsn提供意见。

如果Nan中有DataFrame(字符串值)NaN s(缺失值)或空字符串值,则需要先replace

updated_col =  'Updated Col'
cols = ['1','2','3','4'] + ['Updated Col']
d = {'Nan':np.nan, '': np.nan}
df = df.replace(d)
df[updated_col] = df[cols].ffill(axis=1)[updated_col]
print (df)
               Date    1   2    3    4 Updated Col
0   12/03/2017 0:00  0.4 NaN  NaN  NaN         0.9
1   12/03/2017 0:10  0.4 NaN  NaN  NaN         0.1
2   12/03/2017 0:20  0.4 NaN  NaN  NaN         0.6
3   12/03/2017 0:30  0.9 NaN  0.7  NaN         0.7
4   12/03/2017 0:40  0.1 NaN  NaN  NaN         0.1
5   12/03/2017 0:50  0.6 NaN  NaN  0.5         0.5
6   12/03/2017 1:00  0.4 NaN  0.3  NaN         0.3
7   12/03/2017 1:10  0.3 NaN  NaN  0.2         0.2
8   12/03/2017 1:20  0.9 NaN  NaN  NaN         0.8
9   12/03/2017 1:30  0.9 NaN  NaN  NaN         0.8
10  12/03/2017 1:40  0.0 NaN  NaN  NaN         0.9