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')
我仍然可以获得原始的未转换数据。所以我似乎做错了,但我无法弄清楚如何正确地完成任务。 非常感谢帮助!
答案 0 :(得分:4)
使用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
使用系列中每个项目的指针。你也可以开始使用列表。
答案 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')
请注意,这可能会对内存使用情况和性能产生负面影响。