【问题标题】:Converting pd.read_sql_query to pd.DataFrame converts strings to nan将 pd.read_sql_query 转换为 pd.DataFrame 将字符串转换为 nan
【发布时间】:2019-06-26 14:23:15
【问题描述】:

当我尝试使用pd.DataFrame 将从pd.read_sql_query 生成的SQL 查询带到数据帧时,我的字符串值将转换为nan

我尝试使用 dtypes 来设置每一列的类型

SQL_Query = pd.read_sql_query('''SELECT [CircuitID], [Status], 
                                        [LatestJiraTicket], [MrcNew] 
                                  FROM CircuitInfoTable 
                                  WHERE ([Status] = 'Active') 
                                     OR ([Status] = 'Pending')
                                     OR ([Status] = 'Planned')''', conn)
# print(SQL_Query)
cdf = pd.DataFrame(SQL_Query, columns=['CID', 'Status', 'JiraTicket', 'MrcNew'])

SQL 查询输出:

0                                      OH1004-01  ...      NaN
1                                      OH1004-02  ...      NaN
2                                      OH1005-01  ...      NaN
3                                      OH1005-02  ...      NaN
4                                      AL1001-01  ...      NaN
5                                      AL1001-02  ...      NaN
6                                      AL1007-01  ...      NaN
7                                      AL1007-02  ...      NaN
8                                      NC1001-01  ...      NaN
9                                      NC1001-02  ...      NaN
10                                     NC1001-03  ...      NaN
11                                     NC1001-04  ...      NaN
12                                     NC1001-05  ...      NaN
13                                     NC1001-06  ...      NaN
14                          (ommited on purpose)  ...   5200.0
15                                      MO001-02  ...      NaN
16                                      OR020-01  ...   8000.0
17                                      MA004-01  ...   6500.0
18                                      MA004-02  ...   6500.0
19                                      OR004-01  ...  10500.0
20                          (ommited on purpose)  ...   3975.0
21                                      OR007-01  ...   2500.0
22                          (ommited on purpose)  ...   9200.0
23                          (ommited on purpose)  ...  15000.0
24                          (ommited on purpose)  ...   5750.0
25                                     CA1005-02  ...  47400.0
26                                     CA1005-03  ...  47400.0
27                                     CA1005-04  ...  47400.0
28                                     CA1005-05  ...  47400.0
29                                     CA1006-01  ...      0.0

数据帧输出:

     CID   Status JiraTicket   MrcNew
0    nan  Planned        nan      NaN
1    nan  Planned        nan      NaN
2    nan  Planned        nan      NaN
3    nan  Planned        nan      NaN
4    nan  Planned        nan      NaN
5    nan  Planned        nan      NaN
6    nan  Planned        nan      NaN
7    nan  Planned        nan      NaN
8    nan  Planned        nan      NaN
9    nan  Planned        nan      NaN
10   nan  Planned        nan      NaN
11   nan  Planned        nan      NaN
12   nan  Planned        nan      NaN
13   nan  Planned        nan      NaN
14   nan   Active        nan   5200.0
15   nan  Pending        nan      NaN
16   nan  Pending        nan   8000.0
17   nan  Pending        nan   6500.0
18   nan  Pending        nan   6500.0
19   nan  Pending        nan  10500.0
20   nan   Active        nan   3975.0
21   nan  Pending        nan   2500.0
22   nan   Active        nan   9200.0
23   nan  Pending        nan  15000.0
24   nan   Active        nan   5750.0
25   nan  Pending        nan  47400.0
26   nan  Pending        nan  47400.0
27   nan  Pending        nan  47400.0
28   nan  Pending        nan  47400.0
29   nan  Pending        nan      0.0

【问题讨论】:

    标签: python sql pyodbc


    【解决方案1】:

    基本上,您在pandas.DataFrame 中错误地使用了 columns 参数,其中该参数指定要在结果输出中选择的列(而不是重命名)。从您的查询中,没有 CIDJiraTicket,因此它们会迁移所有缺失值。

    您可能打算重命名列。考虑在 SQL 中使用列别名或在 pandas 中使用 renameset_axis 重命名:

    SELECT [CircuitID] AS [CID], 
           [Status], 
           [LatestJiraTicket] AS JiraTicket, 
           [MrcNew] 
    FROM CircuitInfoTable 
    WHERE ([Status] = 'Active') 
       OR ([Status] = 'Pending')
       OR ([Status] = 'Planned')
    

    熊猫

    cdf = (pd.read_sql_query(...original query...)
             .rename(columns={'CircuitID': 'CID', 'LatestJiraTicket': 'JiraTicket'})
          )
    
    cdf = (pd.read_sql_query(...original query...)
             .set_axis(['CID', 'Status', 'JiraTicket', 'MrcNew'], axis='columns', inplace=False)
          )
    

    【讨论】:

    • 冻糕你用 .set_axis 搞定了...谢谢你的帮助!
    • 很高兴听到并乐于提供帮助!
    • 请不要忘记 StackOverflow 的说法thanks
    猜你喜欢
    • 2018-07-13
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 2016-12-24
    • 2019-10-10
    • 2020-10-24
    • 2015-10-29
    • 1970-01-01
    相关资源
    最近更新 更多