Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Int64上读取熊猫中的_csv而不丢失精度?_Python_Pandas_Dataframe - Fatal编程技术网

Python 如何在Int64上读取熊猫中的_csv而不丢失精度?

Python 如何在Int64上读取熊猫中的_csv而不丢失精度?,python,pandas,dataframe,Python,Pandas,Dataframe,假设我们正在尝试读取此csv文件 导入io 作为pd进口熊猫 未处理的文件内容=“名称、印象、花费” 鲍勃,32,76岁 查理,16,48岁 迈克,, Joao,16728922536906298“ 熊猫\u数据类型={ “名称”:“字符串”, “印象”:“Int64”, “花费美元”:“浮动”, } 如果我们正常读取它,pandas会转换16728922536906298->float->Int,导致它失去精度,变成1672892253690304 df = pd.read_csv(io.S

假设我们正在尝试读取此csv文件

导入io
作为pd进口熊猫
未处理的文件内容=“名称、印象、花费”
鲍勃,32,76岁
查理,16,48岁
迈克,,
Joao,16728922536906298“
熊猫\u数据类型={
“名称”:“字符串”,
“印象”:“Int64”,
“花费美元”:“浮动”,
}
如果我们正常读取它,pandas会转换
16728922536906298
->float->Int,导致它失去精度,变成
1672892253690304

df = pd.read_csv(io.StringIO(unprocessed_file_contents), dtype=pandas_dtypes)
assert df.iloc[3,1] == 167289225369306298  # this fails (and becomes 167289225369306304)
如果使用此方法读取,第一个断言将通过,但第二个断言失败

df = pd.read_csv(io.StringIO(unprocessed_file_contents), header=None, skiprows=1, dtype=pandas_dtypes)
assert df.iloc[3,1] == 167289225369306298  # passes (because it compares it as a pandas type)
assert int(df.iloc[3,1]) == 167289225369306298  # fails (and becomes 167289225369306304)

读取csv
的过程中,如何让pandas将
167289225369306298
作为一个整数?

这个问题似乎是由列中的NaN或空值引起的

通过消除这些空值,它开始按预期工作

import io
import pandas as pd

unprocessed_file_contents = """name,impressions,spend_usd
Bob,32,76
Charlie,16,48
Mike,42324,
Joao,167289225369306298,"""

pandas_dtypes = {
    "name": "string",
    "impressions": "Int64",
    "spend_usd": "float",
}

df = pd.read_csv(io.StringIO(unprocessed_file_contents), dtype=pandas_dtypes)
assert df.iloc[3,1] == 167289225369306298  # passes
还有一个关于这个的bug报告


不幸的是,我们仍然需要包含空数字。。。。