Python 从CSV文件读取时,熊猫会将大数字推断为字符串

Python 从CSV文件读取时,熊猫会将大数字推断为字符串,python,pandas,csv,Python,Pandas,Csv,我有一个CSV文件Pandas\u float\u test.CSV,包含以下内容 C0 20180904115745000007000 当我使用下面的read\u csv读取文件时 with open(os.path.join('data','Pandas_float_test.csv')) as csv_file: df = pd.read_csv(csv_file,header='infer', parse_dates=True) print(df) print(

我有一个CSV文件Pandas\u float\u test.CSV,包含以下内容

C0
20180904115745000007000
当我使用下面的
read\u csv
读取文件时

with open(os.path.join('data','Pandas_float_test.csv')) as csv_file:
    df = pd.read_csv(csv_file,header='infer', parse_dates=True)
    print(df)
    print(df.dtypes)
    print(pd.api.types.is_numeric_dtype(df['C0'])) # returns False
    print(pd.api.types.is_integer_dtype(df['C0'])) # returns False
    print(pd.api.types.is_string_dtype(df['C0'])) # returns True
    print(pd.api.types.infer_dtype(df['C0'])) # returns string
d = {'C0': [20180904115745000007000]}
df = pd.DataFrame(data=d)
print(df)
print(df.dtypes)
print(pd.api.types.is_numeric_dtype(df['C0'])) # returns False
print(pd.api.types.is_integer_dtype(df['C0'])) # returns False
print(pd.api.types.is_string_dtype(df['C0'])) # returns True
print(pd.api.types.infer_dtype(df['C0'])) # returns integer
我希望pandas将数据类型推断为
float64
,但它将其推断为字符串。这是有意的吗

另外,当我尝试在不使用下面的
read_csv
的情况下重新创建相同的内容时

with open(os.path.join('data','Pandas_float_test.csv')) as csv_file:
    df = pd.read_csv(csv_file,header='infer', parse_dates=True)
    print(df)
    print(df.dtypes)
    print(pd.api.types.is_numeric_dtype(df['C0'])) # returns False
    print(pd.api.types.is_integer_dtype(df['C0'])) # returns False
    print(pd.api.types.is_string_dtype(df['C0'])) # returns True
    print(pd.api.types.infer_dtype(df['C0'])) # returns string
d = {'C0': [20180904115745000007000]}
df = pd.DataFrame(data=d)
print(df)
print(df.dtypes)
print(pd.api.types.is_numeric_dtype(df['C0'])) # returns False
print(pd.api.types.is_integer_dtype(df['C0'])) # returns False
print(pd.api.types.is_string_dtype(df['C0'])) # returns True
print(pd.api.types.infer_dtype(df['C0'])) # returns integer
is\u integer\u dtype
返回
False
推断\u dtype
返回整数


我使用的是pandas 0.24.0。

pandas通常将其推断为“字符串”

这是因为最大的int数据类型是int64,它由

int64整数(-9223372036854775808到9223372036854775807)

查看numpy文档中的更多信息:

因此,要转换对象/或显式指定列数据类型,可以使用pandas.read_csv的“dtype”属性,该属性将字典作为输入,包括列名作为键,其数据类型作为值

dtype_dict = {
    'C0': 'float'
}

>>> df = pd.read_csv("sc.csv", dtype=dtype_dict)
>>> df.head()
             C0
0  2.018090e+22
1  2.018090e+22
2  2.018090e+22

Pandas方法
Pandas.read_csv()
Pandas.DataFrame()
都有dtype参数

数据类型:列的类型名称或目录->类型,可选

数据或列的数据类型。例如,{'a':np.float64,'b':np.int32,'c':'Int64'}

因此,您可以在创建数据帧时直接设置类型。如果不这样做,pandas几乎总是默认为string

d = {'C0': [20180904115745000007000]}
df = pd.DataFrame(d, dtype="float")

df.dtypes
返回
C0:float64

谢谢!我知道这一点,但如果数字很小,read_csv会将其推断为整数。更大的数字作为浮点数。它并不总是默认为string..我的用例是这样的,在读取文件时我不能提供数据类型。因此,我必须依靠pandas read_csv推断逻辑来给出正确的数据类型,以便我可以基于数据类型对tht数据系列执行进一步的操作。是的,正如您所提到的,数字太大,不能成为整数,但太小,不能成为浮点数。考虑到pandas有一个float数据类型,我希望pandas推断出它是一个float或一个数值类型,至少不是一个字符串。@erohsikishore这就是为什么我们必须显式地将它指定为float。