python – Pandas返回一个用notnull()过滤的系列

你好开发者,

我目前正在学习大熊猫,并且仍然试图围绕如何分配值,例如转换为特定类型的值,返回原始数据帧.

更具体地说,我有这个数据帧:

     id         A       B
0   50000    12413     32885.0
1   50001     2040     43737.0
3   50002     2040     28015.0
4   50003     2040      NaN
5   50004     2040     28565.0

我的目标是将B列转换为整数,但保留NaN值,因此没有fillna(0).我想要这个:

     id         A       B
0   50000    12413     32885
1   50001     2040     43737
3   50002     2040     28015
4   50003     2040      NaN
5   50004     2040     28565

我这样做了
    print(df.loc [df [‘B’].notnull(),’B’].astype(‘int’))
它起作用了.

        B
0   32885
1   43737
3   28015
4   28565

但是,如果我尝试将其分配回数据框:

df.loc[df['B'].notnull(), 'B'] = df.loc[df['B'].notnull(), 'B'].astype('int')

我仍然得到原始的,未转换的数据.所以我似乎做错了,但我无法弄清楚如何正确地做到这一点.
非常感谢帮助!

最佳答案 使用pandas,避免将NaN与整数相结合

除非你有充分的理由,否则请避免这种做法.原因是pandas只允许在连续的内存块中使用数组进行矢量化计算.这仅适用于相同类型的数据,例如一系列类型为int,float,datetime,但不是object.

NaN被认为是浮动的.因此,将整数与NaN组合会强制将pandas强制转换为浮动整个系列.这会增加内存使用量,但对于大多数用例来说不是问题.

如果你想将NaN与整数结合起来,你需要用dtype = object创建一个系列,并让pandas使用一系列指针.这在计算和存储器密集上是昂贵的.除非绝对必要,否则不要这样做.

但如果你只是……

在将非NaN元素转换为整数之前,您可以将一系列转换为对象:

df['B'] = df['B'].astype(object)

如上所述,您要求pandas / numpy使用系列中每个项目的指针.您也可以开始使用列表.

点赞