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

时间:2019-01-30 12:22:31

标签: python pandas csv

我有一个包含以下内容的CSV文件 Pandas_float_test.csv

C0
20180904115745000007000

当我使用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

我希望熊猫将dtype推断为float64,但是它将dtype推断为字符串。这是故意的吗?

另外,当我尝试不使用read_csv来重新创建相同内容时,

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_integer_dtype返回False,但是infer_dtype返回整数。

我正在使用熊猫0.24.0。

2 个答案:

答案 0 :(得分:0)

熊猫通常将其推断为“字符串”。

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

中的数字

int64整数(-9223372036854775808至9223372036854775807)

>>> 9223372036854775807 > 20180904115745000007000
False

从numpy文档中查看更多内容:: https://docs.scipy.org/doc/numpy-1.15.0/user/basics.types.html

因此,为了转换对象/或显式指定列数据类型,可以使用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

答案 1 :(得分:0)

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

  

dtype:类型名称或列的字典->类型,可选

     

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

因此,您可以在创建数据框时直接设置类型。如果不这样做,大熊猫几乎总是默认为字符串。

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

df.dtypes返回C0: float64