pandas pd.fillna(pd.Series())无法填充所有NaN值

scyqe7ek  于 2023-05-12  发布在  其他
关注(0)|答案(2)|浏览(142)

我想用随机值填充 Dataframe 中的NaN s:

df1 = pd.DataFrame(list(zip(['0001', '0001', '0002', '0003', '0004', '0004'],
                            ['a', 'b', 'a', 'b', 'a', 'b'],
                           ['USA', 'USA', 'USA', 'USA', 'USA', 'USA'],
                           [np.nan, np.nan, 'Jan', np.nan, np.nan, 'Jan'],
                           [1,2,3,4,5,6])),
                    columns=['sample ID', 'compound', 'country', 'month', 'value'])
df1

输出:

sample ID   compound    country month   value
0   0001          a           USA   NaN      1
1   0001          b           USA   NaN      2
2   0002          a           USA   Jan      3
3   0003          b           USA   NaN      4
4   0004          a           USA   NaN      5 
5   0004          b           USA   Jan      6

我基于compound列对数据库进行切片:

df2 = df1.loc[df1.compound == 'a']
df2

输出:

sample ID  compound   country month   value
0   0001      a           USA   NaN      1
2   0002      a           USA   Jan      3
4   0004      a           USA   NaN      5

然后,我尝试使用filler对不重复的值进行fillna

from numpy.random import default_rng

rng = default_rng()
filler = rng.choice(len(df2.month), size=len(df2.month), replace=False)
filler = pd.Series(-abs(filler))

df2.month.fillna(filler, inplace=True)
df2

输出:

sample ID    compound    country month   value
0   0001           a         USA    -1.0    1
2   0002           a         USA    Jan     3
4   0004           a         USA    NaN     5

我希望没有NaN在出,但实际上没有,为什么?

ajsxfq5m

ajsxfq5m1#

问题是您的filler索引与df2不同,因为df2通过布尔索引是df1的一部分,所以您可以

filler = pd.Series(-abs(filler)).set_axis(df2.index)
df2['month'].fillna(filler, inplace=True)
yrdbyhpb

yrdbyhpb2#

示例

s1 = pd.Series([1, 2, None])
s2 = pd.Series([3, 4, 5], index=list('abc'))

在代码下面运行

s1.fillna(s2)

输出:

0    1.0
1    2.0
2    NaN

不同指数的NaN填充剂
这可能不一定是原因。如果这不能解决问题,不要仅仅发布代码和目标,创建并提供一个代表数据集最小示例。
https://stackoverflow.com/help/minimal-reproducible-example

相关问题