【问题标题】:Set data types for specific rows in pandas为 pandas 中的特定行设置数据类型
【发布时间】:2021-02-18 18:27:27
【问题描述】:

在 pandas 中,为整个数据框或特定列设置数据类型非常容易。
我很难找到有关仅更改特定行数据类型的文档。
我的数据框是这样的。

df = pd.DataFrame({"idx": ['Unit', 'From', 'To'], 
                   "Length": ['Meter', 32.5, 65], 
                   "Weight": ['Kg', 7, 44.7]})
df.set_index("idx")

默认情况下,pandas 会将所有内容设置为对象(字符串)。
我希望将第一行视为 string,并将第二和第三行视为 float

这可能吗?

【问题讨论】:

  • 不认为这是可能的。 Pandas 以列方式运行。如果将第一行更改为字符串,则 Length 列中的所有值都将变为 object dtype。
  • 看看你是怎么创建dataframe的,你传的是string value,panda不知道是float~
  • 行没有数据类型,列有。
  • @BEN_YO 这是我创建示例时的错误,我将对其进行编辑。如果我将它们作为浮点数传递,它们会在行级保留为浮点数,即使在同一列中也存在字符串?
  • 补充说明

标签: python pandas


【解决方案1】:

这里的方式仍然不能使列回到float仍然object,因为pandas是存储每个column的数据类型而不是每个index(行)

df.update(df.apply(pd.to_numeric,errors='coerce'))
df
Out[75]: 
     Length Weight
idx               
Unit  Meter     Kg
From   32.5      7
To       65   44.7
df.applymap(type)
Out[76]: 
               Length           Weight
idx                                   
Unit    <class 'str'>    <class 'str'>
From  <class 'float'>  <class 'float'>
To    <class 'float'>  <class 'float'>

更新

当您更改输入时,它自身的数据和单元格已经更改为正确的类型,object 表示列的意思是混合类型而不是字符串

df.applymap(type)
Out[80]: 
               Length           Weight
idx                                   
Unit    <class 'str'>    <class 'str'>
From  <class 'float'>    <class 'int'>
To      <class 'int'>  <class 'float'>

【讨论】:

  • 我的例子显然是对实际问题的简化。当我从 csv 或 excel 中读取数据时,pandas 将它们转换为对象(我猜是因为每一列至少有一个对象?)
  • 啊,我不知道对象意味着混合类型,我一直认为只是字符串!
  • @Leonardo nope 在你的情况下是混合类型〜
【解决方案2】:

在你的情况下使用df.iloc:

import numpy as np 
import pandas as pd 

df = pd.DataFrame({
    'A': ['m','1','2.6','4.7'],
    'B': ['e','3','4.7','1.2']
})
df.iloc[1:] = df.iloc[1:].astype(float)
print(df)

【讨论】:

  • dtypes 仍然是结果帧中的对象
  • 但是没有数据类型,你可以应用计算操作,例如这些行上的 sum()
猜你喜欢
  • 1970-01-01
  • 2018-02-20
  • 2022-01-23
  • 2018-05-25
  • 1970-01-01
  • 1970-01-01
  • 2014-03-10
  • 2015-10-10
  • 1970-01-01
相关资源
最近更新 更多