【问题标题】:preventing pandas.DataFrame.loc from typecasting防止 pandas.DataFrame.loc 进行类型转换
【发布时间】:2020-02-07 21:23:42
【问题描述】:

如果我们初始化一个pandas.DataFrame,其类型将为int64

import numpy as np
import pandas as pd 

df1 = pd.DataFrame(np.arange(4).reshape((2,2)), columns=['one','two'])

然后将第一列类型转换为np.str 并查看第二行:

(1)

df2 = df1.astype({'one':np.str}) 
df2.loc[1,]

df2.loc[1,] 返回一个类型为 object 的 pandas.Series,并保留元素的类型。

但是,如果我们将第二个第一列类型转换为np.float

(2)

df3 = df1.astype({'one':np.float})
df3.loc[1,]             

df3.loc[1,] 返回一个类型为float64 的pandas.Series,即'two' 列中的int64 被提升为float64

有没有办法确保df.loc 始终保留 (1) 中的类型,避免 (2) 中的行为?

(我为什么要关心?因为整数可以作为索引传递,浮点数不能,而且我对必须重铸对象有点恼火,因为熊猫认为我想要的返回值不是我所拥有的最初放入我的数据框中)

【问题讨论】:

  • df3.loc[1,] 您正在访问第一行,而不是“二”列。您可以看到df3.info() 将列two 的dtype 保留为int64。
  • @vb_rises,我在df1 中输入了一个“int”,输出来自df3.loc[1,] 的浮点数。正如您指出的那样,df3.info() 说那里有一个int,所以当返回值时,某处的类型更改为float。而且我怀疑loc 正在这样做,这是我不想要的。
  • 您实际期望的输出是什么,您可以发布吗? df.loc() 函数旨在返回一个系列,因此它将转换为可以适合所有值的 dtype。如果您想从每一行访问特定元素,那么您可以执行 df3.loc[1:,'two'] 并返回 int。这里 1 = 第一行,因此您可以迭代并获取相关元素。

标签: python pandas dataframe slice


【解决方案1】:

当您将整数和浮点数组合成一个系列时,它会将整数转换为您发现的浮点数。解决此问题的一种方法是在数据框中设置 dtype=object,如下所示:

import numpy as np
import pandas as pd 

df1 = pd.DataFrame(np.arange(4).reshape((2,2)), columns=['one','two'], dtype=object)

df2 = df1.astype({'one':np.str}) 
df2.loc[1,]

one    2
two    3
Name: 1, dtype: object

df3 = df1.astype({'one':np.float})
df3.loc[1,]

one    2
two    3
Name: 1, dtype: object

Link

【讨论】:

    猜你喜欢
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多