【问题标题】:How to prevent pandas.read_gbq infer data types of columns如何防止 pandas.read_gbq 推断列的数据类型
【发布时间】: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,这将是错误的

标签: python pandas google-bigquery


【解决方案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

【讨论】:

    猜你喜欢
    • 2019-07-24
    • 2015-06-12
    • 1970-01-01
    • 2012-08-19
    • 2016-05-02
    • 2019-06-22
    • 2020-04-29
    • 2020-05-30
    • 1970-01-01
    相关资源
    最近更新 更多