Xyz*_*Xyz 5 python precision numpy pandas amazon-redshift
我正在使用 Pandas 从 Redshift 读取数据。我有一个bigint( int8) 列,它以指数形式出现。我尝试了以下方法,但在这些情况下会截断数据。
该列中数据的样本值为:635284328055690862。它读作6.352843e+17.
我试图将其转换int64为 Python。
import numpy as np
df["column_name"] = df["column_name"].astype(np.int64)
Run Code Online (Sandbox Code Playgroud)
在这种情况下的输出是:635284328055690880。在这里我丢失了我的数据,它0最终将其扩展到。
预期输出: 635284328055690862
甚至,如果我这样做,我也会得到相同的结果。
pd.set_option('display.float_format', lambda x: '%.0f' % x)
Run Code Online (Sandbox Code Playgroud)
输出: 635284328055690880
预期输出: 635284328055690862
这似乎是 Pandas 的正常行为。我什至尝试使用列表创建一个 Dataframe 并且仍然得到相同的结果。
import pandas as pd
import numpy as np
pd.set_option('display.float_format', lambda x: '%.0f' % x)
sample_data = [[635284328055690862, 758364950923147626], [np.NaN, np.NaN], [1, 3]]
df = pd.DataFrame(sample_data)
Output:
0 635284328055690880 758364950923147648
1 nan nan
2 1 3
Run Code Online (Sandbox Code Playgroud)
我注意到的是,每当我们有nan数据框时,我们都会遇到这个问题。
我正在使用以下代码从 Redshift 获取数据。
from sqlalchemy import create_engine
import pandas as pd
connstr = 'redshift+psycopg2://<username>:<password>@<cluster_name>/<db_name>'
engine = create_engine(connstr)
with engine.connect() as conn, conn.begin():
df = pd.read_sql('''select * from schema.table_name''', conn)
print(df)
Run Code Online (Sandbox Code Playgroud)
请帮我解决这个问题。提前致谢。
小智 1
修复方法之一可以是select * from schema.table_name。您可以单独传递所有列,然后转换特定列。
假设表中有 5 列,col2 是bigint(int8)列。所以,你可以像下面这样阅读:
from sqlalchemy import create_engine
import pandas as pd
connstr = 'redshift+psycopg2://<username>:<password>@<cluster_name>/<db_name>'
engine = create_engine(connstr)
with engine.connect() as conn, conn.begin():
df = pd.read_sql('''select col1, cast(col2 as int), col3, col4, col5... from schema.table_name''', conn)
print(df)
Run Code Online (Sandbox Code Playgroud)
PS:我不确定这是最聪明的解决方案,但从逻辑上讲,如果 python 无法int64正确转换,那么我们可以从自身读取转换值SQL。
此外,如果长度超过 17,我想尝试动态转换 int 列。