如何防止 pandas.read_gbq 推断列的数据类型

Posted

技术标签:

【中文标题】如何防止 pandas.read_gbq 推断列的数据类型【英文标题】:How to prevent pandas.read_gbq infer data types of columns 【发布时间】:2019-11-25 20:12:45 【问题描述】: 我正在使用pandas.read_gbq 从 google bigquery 读取表格。我面临的问题是pandas 自动推断每列的数据类型,这是造成问题。 例如,在表中我有一个列名aspect_ratio,pandas 会自动将所有值转换为我想要阻止的浮点数。
source        df          expected
55            55.0        55
25            25.0        25
21            21.0        21
nan           nan         nan
22            22.0        22
22.5          22.5        22.5
我需要在这里没有浮点的精确表示。 我想要源列的字符串表示形式。 我尝试了以下解决方案,但它不起作用。
df['col'].astype(str) # this will just change 55.0 to '55.0' 
df['col'].astype(int) # this will also wont work since it will raise error for 22.5
我已检查 documentation 中的 pandas.read_gbq,但在这种情况下找不到任何可以提供帮助的信息。 我还想知道我可以在 python 中使用的任何其他选项,不仅限于pandas

【问题讨论】:

@Ben.T 我已经更新了这个问题,希望现在更清楚,你会明白为什么 astype('Int') 或 astype('str') 类型的解决方案不起作用。 查看文档后,您似乎无法针对read_gbq 做任何专门的事情。我的建议是将其转换为字符串,然后在 s[-2:] == '.0' 的情况下进行另一个修剪字符串的转换 @rtenha 对于22.5 的情况,该破解将失败。应该是 22.5 而不是 22.0 什么意思?如果字符串的最后两个字符是.0,它只会修改字符串,对于22.5,这将是错误的 【参考方案1】:

BigQuery 表中的原始值是字符串吗?如果是的话,pandas-GBQ 会进行这种转换,这似乎令人惊讶。

如果这些值最初是字符串,您可以尝试使用官方的BigQuery storage API adapter,这可能会产生不同的结果。

如果这只是一个显示问题,您可以使用自定义 Pandas 格式化程序:

def format(f):
    if f % 1 == 0:
        return repr(int(f))
    return repr(f)
# should be able to set this locally as well.
pd.options.display.float_format = format 
pd.DataFrame([[.5], [-5.0], [22.5]], columns=['a'])

产量:

     a
0  0.5
1   -5
2 22.5

【讨论】:

以上是关于如何防止 pandas.read_gbq 推断列的数据类型的主要内容,如果未能解决你的问题,请参考以下文章

如何将 dryRun 参数发送到 pandas.read_gbq 函数

在 Jupyter Notebook 中进行时,pandas.read_gbq() 在哪里“保存”查询?

pandas read_gbq 不工作并显示错误

使用 Dataflow 的 Pandas read_gbq 初始化错误

尝试使用 pandas.read_gbq() 函数时,pandas-gbq 抛出错误“找不到字段 google.protobuf.FileOptions.php_metadata_namespace”

如果存在于列表中,则根据另一列的值选择列