如何防止 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() 在哪里“保存”查询?
使用 Dataflow 的 Pandas read_gbq 初始化错误
尝试使用 pandas.read_gbq() 函数时,pandas-gbq 抛出错误“找不到字段 google.protobuf.FileOptions.php_metadata_namespace”