Pandas回收一个用notnull()过滤的系列

时间:2018-05-30 11:42:14

标签: python pandas series

Hello开发人员,

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

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

     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')

我仍然可以获得原始的未转换数据。所以我似乎做错了,但我无法弄清楚如何正确地完成任务。 非常感谢帮助!

2 个答案:

答案 0 :(得分:4)

使用pandas时,请避免将NaN与整数组合

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

NaN被视为float。因此,默认情况下,将整数与NaN强制pandas结合使用可将整个系列向上转换为float。这会增加内存使用量,但对于大多数用例来说不是问题。

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

但如果你只是......

在将非object元素转换为整数之前,您可以将系列转换为NaN

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

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

答案 1 :(得分:2)

由于type(np.nan)float,您需要先转换列的类型。例如,你可以做

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

请注意,这可能会对内存使用情况和性能产生负面影响。