熊猫不想要的类型转换.DataFrame.update



Panda在更新中将列的类型从int更改为float有什么原因吗?我能阻止它这样做吗?以下是问题的一些示例代码

import pandas as pd
import numpy as np
df = pd.DataFrame({'int': [1, 2], 'float': [np.nan, np.nan]})
print('Integer column:')
print(df['int'])
for _, df_sub in df.groupby('int'):
    df_sub['float'] = float(df_sub['int'])
    df.update(df_sub)
print('NO integer column:')
print(df['int']) 

原因如下:由于您正在有效地屏蔽列上的某些值并替换它们(使用更新),因此某些值可能会变成`nan

在整数数组中,这是不可能的,因此数字dtype被先验地转换为float(为了提高效率),因为首先检查比进行更昂贵

可以将数据类型改回。。。只是现在不在代码中,因此这是一个错误(尽管修复起来有点不平凡):github.com/pydata/pandas/issues/4094

如果您的int64列中有大值,当更新将它们转换为浮点值时,这会导致数据精度损失。所以回到Jeff的建议:df['int'].astype(int)并不总是可能的。

我的解决方法是:

df_sub['int'] = df_sub['int'].astype('Int64')  # Int64 with capital I, supports NA values
df.update(df_sub)
df_sub['int'] = df_sub['int'].astype('int')

以上避免了转换为浮点类型。我转换回int类型(而不是将其保留为Int64)的原因是panda似乎在几个操作中缺乏对该类型的支持(例如,concat给出了一个关于missing.view的错误)

也许他们可以在问题4094 中包含上述修复

最新更新