首页 > 解决方案 > 熊猫分配回一个用 notnull() 过滤的系列

问题描述

各位开发者您好,

我目前正在学习 pandas,并且仍在尝试如何分配值,例如,我将其转换为特定类型,返回到原始数据帧。

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

     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原样,所以 no 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')

我仍然得到原始的、未转换的数据。所以我似乎做错了作业,但我不知道如何正确地做。帮助将不胜感激!

标签: pythonpandasseries

解决方案


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

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

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

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

但如果你只是必须...

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

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

如上所述,您要求pandas/numpy为您的系列中的每个项目使用一个指针。您不妨开始使用列表。


推荐阅读