【问题标题】:Why did I get dtype 'object' on reading in my data frame?为什么我在读取数据框时会得到 dtype 'object'?
【发布时间】:2018-10-17 01:17:34
【问题描述】:

我是Python新手,想确定数据框中每一列的类型,我写了下面的代码,但结果不符合预期,我只得到'object'的类型。

这是我的数据框(只是前 7 列):

      IDINDUSANALYSE    IDINDUS IDINDUSEFFLUENT DATEANALYSE IDTYPEECHANTILLON   IDPRELEVEUR IDLABO  IDORIGINEVAL    CONFORME    CONFCALC    IDINDDOSS   CONFFORCE
  672   635 6740    10/01/13    2   1   3   1   1   1   531 0
  673   635 6740    11/01/13    2   1   3   1   1   1   531 0
  674   635 6740    14/01/13    2   1   3   1   1   1   531 0
  675   635 6740    15/01/13    2   1   3   1   1   1   531 0
  676   635 6740    16/01/13    2   1   3   1   1   1   531 0
  677   635 6740    18/01/13    2   1   3   1   1   1   531 0

这是我的代码:

import pandas as pd
import csv

with open("/home/***/Documents/Table3.csv") as f:
    r = csv.reader(f)

df = pd.DataFrame().from_records(r)
for index, row in df.iterrows():
    print(df.dtypes)   

结果我得到了这个:

0      object
1      object
2      object
3      object
4      object

请告诉我们我做错了什么?

【问题讨论】:

  • 请出示您的实际 CSV 文件。如果所有列都存储为object,似乎它们被检测为字符串,可能是因为您的 CSV 文件引用了每个字段。但发布您的实际 CSV 文件。

标签: python csv dataframe types


【解决方案1】:
types = df.columns.to_series().groupby(df.dtypes).groups

然后打印出types,你会得到所有的列类型(按类型分组)。

此外,您可以使用以下命令将 .csv 文件直接打开到数据框:pd.read_csv(filepath)

如果您想要特定列的类型 - df.column.dtypedf['column'].dtype

【讨论】:

  • 嘿@David 感谢您的回复,我有这个结果,但似乎无法在上面找到类型日期,它应该出现,因为我的数据中有日期类型 {dtype('int64 '): 索引(['59', '2', '1', '163', '1208', '271', ... '1875', '1876', '1877', '1883', ' 1886', '1887', '1888', '1902', '1903', '1905'], dtype='object', length=330), dtype('float64'): Index(['60', ' 1289', '1935', '335',​​ '1547', '189', '1206', ... '1970', '1971', '1972'], dtype='object', length=388), dtype('O'): 索引(['IDINDUSDEBITEFFLUENT'], dtype='object')}
  • 您的日期似乎存储为一个对象。请尝试打印出df.DATEANALYSE.dtype
  • 我收到此错误:AttributeError: 'DataFrame' object has no attribute 'DATEANALYSE'
  • 这很奇怪。你确定没有排版错误?一切都在正确的情况下?
  • @ner csv.reader 会将所有内容读取为字符串(它被归类为对象)-您不想使用它...直接使用 pd.read_csv('your_file.csv') 然后您将获得一个标题行来命名您的列,pandas 将尝试并在可能的情况下自动输入您的列。所以按字面意思使用:df = pd.read_csv("/home/***/Documents/Table3.csv") 然后你可以访问df.columnsdf.dtypes
【解决方案2】:

试试这个

import pandas as pd
df = pd.read_csv("/home/***/Documents/Table3.csv")
types = [df['{0}'.format(i)].dtype for i in df.columns]
print(types)

结果为

[dtype('float64'), dtype('O'), dtype('O')]

考虑到您的实际数据框有 4 列,但您得到了 5 次 object 作为结果,这是您的第一个提示。

【讨论】:

  • 感谢您的回复,我刚刚从数据中复制了一个样本,所以没有看到我复制了不同的大小,但我在我拥有的实际数据中尝试了你的代码,我有这个[dtype('int64'), dtype('int64'), dtype('O'), dtype('float64'), dtype('float64'), dtype('int64'), dtype('float64'), dtype('int64'), dtype('float64'), dtype('int64'), dtype('int64')],但我不明白为什么我没有 DATE 类型
  • 我已经更改了数据样本@dragonfire__007
  • 对于日期问题,您必须在包含日期的特定列上使用日期解析器。你可以试试这样的:dateparse = lambda x: pd.datetime.strptime(x, '%d-%m-%y')df = pd.read_csv("/home/***/Documents/Table3.csv", parse_dates=['DATEANALYSE'], date_parser=dateparse)
【解决方案3】:

请出示您的实际 CSV 文件。如果所有列都存储为object,似乎它们被检测为字符串,可能是因为您的 CSV 文件引用了每个字段。但发布您的实际 CSV 文件。

要读取 pandas 中的引用字段并将它们转换回它们的类型(数字/分类),请执行以下任一操作:

pd.read_csv(..., quoting = pd.QUOTE_ALL)
pd.read_csv(..., quoting = pd.QUOTE_NONNUMERIC)

并阅读https://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html中的“引用”部分

但是,明确地传递pd.read_csv(..., dtype={...} 一个告诉它每个列名使用哪种类型的字典也是一个好习惯。 e.g. {‘a’: np.float64, ‘b’: np.int32}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多