在一个pandas数据框中,我如何用一个值列表来填充缺失的值

92dk7w1h  于 2023-05-05  发布在  其他
关注(0)|答案(2)|浏览(194)

我有一个dataframe,看起来像这样:

df = pd.DataFrame({'animals': [None, 'cat', 'dog', None, 'hippo', 'elephant']})

动物列有两个“无”值。
我想用一个值替换第一个缺失值,用另一个值替换第二个缺失值。
到目前为止,我的代码只替换了第一个缺失值。不更新第二个缺失值。

new_df = df.animals.fillna(pd.Series(['unknown1', 'unknown2'])
new_df

0    unknown1
1         cat
2         dog
3         NaN
4       hippo
5    elephant
Name: animals, dtype: object

我期望索引3的值等于unknown2。
我怎样才能让它工作,以便我可以用一个pandas序列的缺失值替换给定列中的缺失值,该序列的长度等于该列中缺失值的数量?

xzv2uavs

xzv2uavs1#

fillna与相同长度的系列一起使用:

s = pd.Series(['unknown1', 'unknown2'])
df['animals'] = df['animals'].fillna(df['animals'].isna().cumsum().sub(1).map(s))
df

    animals
0  unknown1
1       cat
2       dog
3  unknown2
4     hippo
5  elephant

如何运作

当前方法的问题是fillna要么使用单个填充值,要么使用与要填充的列/DataFrame长度相同的Series。然后,它将从序列中获取第N个填充值,以填充列中第N个位置处的NaN。从文档:
value : scalar, dict, Series, or DataFrame
用于填充孔的值(例如0),或者是一个dict/Series/DataFrame的值**,指定每个索引**(对于Series)或列(对于DataFrame)使用哪个值。
因此,我们通过创建一个具有类似值的临时序列来解决这个问题,该序列在正确的位置具有我们想要的填充值:

df['animals'].isna().cumsum()

0    1
1    1
2    1
3    2
4    2
5    2
Name: animals, dtype: int64

s = pd.Series(['unknown1', 'unknown2'])
df['animals'].isna().cumsum().sub(1).map(s)

0    unknown1
1    unknown1
2    unknown1
3    unknown2
4    unknown2
5    unknown2
Name: animals, dtype: object
3pmvbmvn

3pmvbmvn2#

我如何才能让它工作,以便我可以用一个pandas系列的缺失值替换给定列中的缺失值,其长度等于该列中缺失值的数量
你可以简单地使用loc而不使用pd.Series来避免索引对齐问题:

df.loc[df['animals'].isna(), 'animals'] = ['unknown1', 'unknown2']

输出:

>>> df
    animals
0  unknown1
1       cat
2       dog
3  unknown2
4     hippo
5  elephant

您的代码只有在您对Series使用相同的索引时才能工作:

>>> df['animals'].fillna(pd.Series(['unknown1', 'unknown2'], 
                                   index=df[df['animals'].isna()].index))

0    unknown1
1         cat
2         dog
3    unknown2
4       hippo
5    elephant
Name: animals, dtype: object

相关问题