从 MS SQL 加载后,panda df 未显示所有行

panda df not showing all rows after loading from MS SQL

我正在使用 Pandas 和最新的 sqlalchemy (1.4.36) 来查询 MS SQL 数据库,使用以下 Python 3.10.3 [Win] 片段:

import pandas as pd                                             # 
from sqlalchemy import create_engine, event
from sqlalchemy.engine.url import URL
# ...
def get_table_columns():
    SQLA = 'SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME LIKE \'pa%\' ORDER BY TABLE_NAME;' 

    # Use pandas for getting named table & columns
    conn_str = set_db_info()
    conn_url = URL.create("mssql+pyodbc", query={"odbc_connect": conn_str})
    engine = create_engine(conn_url)

    df = pd.read_sql(SQLA, engine)

    # Permanently changes the pandas settings
    pd.set_option('display.max_rows', None)
    pd.set_option('display.max_columns', None)
    print(df)
    return df

但是,这只会打印前 292 行,而不是全部 2351 行。使用 REPL,我可以通过以下方式检查:

>>> z = get_table_columns()
>>> z
                TABLE_NAME        COLUMN_NAME
0                    paacc           accesscd
... # <-- I added these
292                paapepi        piapeheadat

>>> z.count()
TABLE_NAME     2351
COLUMN_NAME    2351
dtype: int64

>>> z.shape[0]
2351

>>> z.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 2351 entries, 0 to 2350
Data columns (total 2 columns):
 #   Column       Non-Null Count  Dtype
---  ------       --------------  -----
 0   TABLE_NAME   2351 non-null   object
 1   COLUMN_NAME  2351 non-null   object
dtypes: object(2)
memory usage: 36.9+ KB

问:这是怎么回事,为什么我不能 print/show 所有行?

要显示 pandas 中的所有行,您应该将显示选项设置为 None 或从数据帧大小中额外增加 1 个,就像您在代码中所做的那样:

pd.set_option('display.max_rows', None)
pandas.set_option('display.max_rows', z.shape[0]+1)

鉴于这不是问题,可能是您使用的 IDE 或程序自动从视图中裁剪了此信息(例如 Ipython 裁剪了每个大输出)。

要尝试的另一件事是强制打印数据框,而不是仅打印 return 值:

>>> print(z)

要检查所有内容,我建议您将其传递到 csv/excel 文件中以做得更好。

问题是 pandas returns 一个 打包的 数据帧 (DF)。因此,在打印时,您只能从数据中得到部分(最好)或损坏(最坏)的字符串。

出于某种原因,这在默认情况下始终处于打开状态,并且关于显示的 string/data 的数量,结果差异很大。解决方案是使用 unpacking 运算符 (*) before/when 尝试打印 df ,像这样:

print(*df)

(对于 Ruby 爱好者来说,这也称为 splat 运算符。)


参考和教程