pandas 按键使用先前值或后续值填充缺失值

ws51t4hk  于 2023-04-28  发布在  其他
关注(0)|答案(2)|浏览(151)

我有一个pandas dataframe:import pandas as pd import numpy as 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的缺失值。
在这种情况下,生成的dataframe看起来像这样:

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中实现吗?

fcg9iug3

fcg9iug31#

有几种方法可以做到这一点。如果每组只有一个非空值,并且希望将其作为所有NaN的填充值,则使用groupbytransform的简单方法可以工作:

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和forwardfill/回填每组。

(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调用很有用。

lkaoscv7

lkaoscv72#

创建将col1值Map到col2值的字典:

map_col1_to_col2 = df1[['col1', 'col2']].dropna().set_index('col1').to_dict()['col2']

然后对于col2缺失的所有行:使用map_col1_to_col2字典Mapcol1,并将其分配为col2。

df1.loc[df1['col2'].isna(), 'col2'] = df1.loc[df1['col2'].isna(), 'col1'].map(dict_map)

相关问题