各位开发者大家好,
我目前正在学习 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
值不变,因此没有 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
被认为是 float
。因此,将整数与 NaN
组合会强制 pandas
默认将整个系列向上转换为 float
。这会增加内存使用量,但对于大多数用例而言不是问题。
如果您希望将 NaN
与整数组合,您需要使用 dtype=object
创建一个系列,并让 pandas
使用一个一系列的指针。这在计算和内存密集型方面是昂贵的。除非绝对必要,否则不要这样做。
但如果您只是必须...
在将非 NaN
元素转换为整数之前,您可以将系列转换为 object
:
df['B'] = df['B'].astype(object)
如上所述,您要求 pandas
/numpy
为系列中的每个项目使用一个指针。您不妨开始使用列表。
关于python - Pandas 分配回使用 notnull() 过滤的系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50603794/