【问题标题】:Pandas single row indexing without casting熊猫单行索引没有强制转换
【发布时间】:2019-04-10 01:10:32
【问题描述】:

索引包含对象(字符串)的 Pandas DataFrame 的单行会返回一个类型为 object 的 Series。

df1 = pd.DataFrame({'a': np.arange(3), 'b': np.arange(0.5,3),'c': list('def')})

df1
   a    b  c
0  0  0.5  d
1  1  1.5  e
2  2  2.5  f

df1.loc[0]
a      0
b    0.5
c      d
Name: 0, dtype: object

对不包含对象(字符串)的 Pandas DataFrame 的单行进行索引会返回一个转换其值的 Series。列 a 在 DataFrame 中属于 int64 类型。结果系列包含a 列的值作为float64

df2 = pd.DataFrame({'a': np.arange(3), 'b': np.arange(0.5,3)})

df2
  a    b
0  0  0.5
1  1  1.5
2  2  2.5

df2.loc[0]

a    0.0
b    0.5
Name: 0, dtype: float64

这种行为似乎不一致,是吗? 如何在不将整数转换为浮点数的情况下选择第二个 DataFrame df2 的单行?

【问题讨论】:

标签: python pandas dataframe indexing


【解决方案1】:

根据@Michael 在 cmets 中发布的 stackoverflow 链接,一种解决方案:

desired_index = 3

df.astype('O').iloc[desired_index]

我的数据框很大,将整个数据框转换为对象需要一段时间。这是一个更快但更复杂的解决方案。

df.iloc[[desired_index]].astype('O').iloc[0]

【讨论】:

    【解决方案2】:

    Series中有多个type时,pandas会使用object来处理,如果是float和int,就会把int改成float

    df1.loc[0].map(type)
    Out[6]: 
    a      <class 'numpy.int32'>
    b    <class 'numpy.float64'>
    c              <class 'str'>
    Name: 0, dtype: object
    

    【讨论】:

    • 问题是,df2 也有不同的类型(int64 和 float64)。结果系列将我的 int64 转换为 float64。
    • @checkThisOut 字符串不能被 float 的更改所覆盖,因此它将转换为 object 。类型提升到对象
    猜你喜欢
    • 1970-01-01
    • 2015-11-10
    • 2022-12-04
    • 1970-01-01
    • 2017-02-17
    • 2014-04-01
    相关资源
    最近更新 更多