Python聚合函数(例如sum)不处理对象数据类型,但赢得';当他们';你也改了吗?
我正在从CSV文件导入数据,该文件包含文本、日期和数字列。我使用Python聚合函数(例如sum)不处理对象数据类型,但赢得';当他们';你也改了吗?,python,pandas,csv,Python,Pandas,Csv,我正在从CSV文件导入数据,该文件包含文本、日期和数字列。我使用pandas.read_csv()来读取它,但我没有指定每个列的数据类型。这里是该csv文件的一部分(为粗制滥造的格式道歉) 现在这两列(total\u imp\u pma,char\u value\u aa503)的导入方式非常不同。我导入所有数字字段并创建一个名为base\u varlist4的新数据框,它只包含数字列 当我运行base\u varlist4.d类型时,我得到: total_imp_pma ob
pandas.read_csv()
来读取它,但我没有指定每个列的数据类型。这里是该csv文件的一部分(为粗制滥造的格式道歉)
现在这两列(total\u imp\u pma
,char\u value\u aa503
)的导入方式非常不同。我导入所有数字字段并创建一个名为base\u varlist4
的新数据框,它只包含数字列
当我运行base\u varlist4.d类型时,我得到:
total_imp_pma object
char_value_aa503 float64
如您所见,total\u imp\u pma
已作为对象导入。那么,问题就意味着如果我运行这个:
#calculate max, and group by obs_date
output_max_temp=base_varlist4.groupby('obs_date').max(skipna=True)
#reset obs_date to be treated as a column rather than an index
output_max_temp.reset_index()
#reshape temporary output to have 2 columns corresponding to variable and value
output_max=pd.melt(output_max_temp, id_vars='obs_date', value_vars=varlist4)
当varlist4
只是我的列列表时,我得到的total\u imp\u pma
的最大值是错误的,但是char\u value\u aa503的最大值是正确的
从逻辑上讲,这意味着我应该将对象total\u imp\u pma
更改为浮点或整数。但是,当我跑步时:
base\u varlist4[varlist4]=base\u varlist4[varlist4]。应用(pd.to\u numeric,errors='concurve')
然后继续做最大值,我仍然得到一个不正确的结果
这是怎么回事?为什么pandas.read_csv()
导入一些列作为对象
dtype,而导入其他列作为int64
或float64
dtype?为什么转换不起作用
我有一个理论,但我不知道如何解决它。我在源数据的两列中看到的唯一区别是,total\u imp\u pma
一直都有混合类型的单元格。例如,66979
是一个General
单元格,而稍低一点的单元格的值为1760.60
作为一个数字
我认为某些列中的混合单元格类型导致了pandas.read_csv()
被混淆,只需说“幼崽,不知道这是什么,将其作为对象导入”
。。。我该如何解决这个问题
编辑:这是一份符合以下要求的MCVE。
CSV中的数据为:
Char_Value_AA503 Total_IMP_PMA
1293 19.9
1831 0.9
1.2
243 2,666.50
代码是:
import pandas as pd
loc = r"xxxxxxxxxxxxxx"
source_data_name = 'import_problem_example.csv'
reporting_date = '01Feb2018'
source_data = pd.read_csv(loc + source_data_name)
source_data.columns = source_data.columns.str.lower()
varlist4 = ["char_value_aa503","total_imp_pma"]
base_varlist4 = source_data[varlist4]
base_varlist4['obs_date'] = reporting_date
base_varlist4[varlist4] = base_varlist4[varlist4].apply(pd.to_numeric, errors='coerce')
output_max_temp=base_varlist4.groupby('obs_date').max(skipna=True)
#reset obs_date to be treated as a column rather than an index
output_max_temp.reset_index()
#reshape temporary output to have 2 columns corresponding to variable and value
output_max=pd.melt(output_max_temp, id_vars='obs_date', value_vars=varlist4)
""" Test some stuff"""
source_data.dtypes
output_max
source_data.dtypes
如您所见,total_imp_pma的最大值为19.9
,当它应该是2666.50
时,如果我们能看到(一点)CSV文件并有一个演示问题的示例,这将非常有用。当pandas从CSV读取数据时,它会尝试推断数据类型。列只能有一个数据类型,因此不能有包含字符串的int64
列。这将被存储为一个对象,基本上是任何东西的容器。当它看到类似于1760.60的东西时,它会看到一个逗号,因此它决定它不是一个数字,所以它将它存储为一个字符串,并给出该列dtype=object
。如果只是一个逗号把事情搞砸了,请尝试将数千=”,“
添加到您的pd.read_csv()
参数中,它可能会在初始读取时得到。根据您的请求添加了一个MCVE@AhmedFasih。@Aaraeus,您的数据转储不是MCVE。有太多的行(5行就可以了),其中一些包含1个数字(我们怎么知道什么是空的?),请尝试df.head(5).to_dict()
给我们一些有效的东西。这应该更好。MCVE现在有5行作为数据导入。