我有这个 pandas 数据框: 将 pandas 导入为 pd 将 numpy 导入为 np
ds1 = {'col1':[1,1,1,1,1,1,1, 2,2,2,2,2,2,2], "col2" : [1,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN, np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,np.NaN,3]}
df1 = pd.DataFrame(data=ds1)
print(df1)
col1 col2
0 1 1.0
1 1 NaN
2 1 NaN
3 1 NaN
4 1 NaN
5 1 NaN
6 1 NaN
7 2 NaN
8 2 NaN
9 2 NaN
10 2 NaN
11 2 NaN
12 2 NaN
13 2 3.0
对于 col1
的相同值,我需要使用 col1
中存在的非缺失值来填充 col2
的缺失值。
在这种情况下,生成的数据框将如下所示:
col1 col2
0 1 1.0
1 1 1.0
2 1 1.0
3 1 1.0
4 1 1.0
5 1 1.0
6 1 1.0
7 2 3.0
8 2 3.0
9 2 3.0
10 2 3.0
11 2 3.0
12 2 3.0
13 2 3.0
有人知道如何用Python实现吗?
最佳答案
有几种方法可以做到这一点。使用 groupby
的更简单方法和 transform
如果每组只有一个非空值并且您希望将其作为所有 NaN 的填充值,则有效:
df1.groupby('col1')['col2'].transform('first')
0 1.0
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
6 1.0
7 3.0
8 3.0
9 3.0
10 3.0
11 3.0
12 3.0
13 3.0
Name: col2, dtype: float64
df1['col2'] = df1.groupby('col1')['col2'].transform('first')
或者,groupby
和每个组的前向填充/回填。
(df1.groupby('col1', as_index=False, group_keys=False)['col2']
.apply(lambda c: c.ffill().bfill()))
0 1.0
1 1.0
2 1.0
3 1.0
4 1.0
5 1.0
6 1.0
7 3.0
8 3.0
9 3.0
10 3.0
11 3.0
12 3.0
13 3.0
Name: col2, dtype: float64
如果您的数据如下所示,我建议您使用此选项:1、NaN、NaN、2、NaN、NaN、3、NaN、NaN。因为这些填充仅根据最后一个非空值回填缺失值。
如果您有前导 NaN,则尾随的 bfill
调用非常有用。
关于python - 按键用先前或后续值填充缺失值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76122411/