Python聚合函数(例如sum)不处理对象数据类型,但赢得';当他们';你也改了吗?

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

我正在从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          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行作为数据导入。