使用 Pandas 从 Redshift 读取 bigint (int8) 列数据,无需科学记数法

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 列。