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

Posted

技术标签:

【中文标题】如果存在于列表中,则根据另一列的值选择列【英文标题】:Select columns based on values of another column if present in a list 【发布时间】:2019-04-03 18:46:29 【问题描述】:

我正在尝试使用 pandas.read_gbq 根据列表中存在的列 C 的值从我的 Bigquery 表中选择列 A 和 B。但是,当我使用format 在查询字符串中插入列表时,列表的内容会被[] 方括号括起来。这打破了我的查询。

我在查询字符串上使用了replace 来手动删除方括号。

values_in_list = ['a', 'b', 'c']
query = """
SELECT
  column_A,
  column_B

FROM
  my_table

WHERE
 column_C IN ()
""".format(values_in_list).replace('[', '').replace(']', '')
query_df = pandas.read_gbq(query, project_id='some-project', dialect='standard')

这样就完成了工作。我想知道是否有比暴力破解更优雅的解决方案。

【问题讨论】:

最好通过查询参数传递values_in_list,看这个example。 非常感谢您的回复。我按照您提供的链接进行操作。当我使用 'type': 'STRING' paramterType 时,此查询仅返回列表的第一个元素之类的值。当我尝试'type': 'ARRAY' 时,它返回了一个基于GenericGBQExceptionBadRequest 【参考方案1】:

我不确定pandas.read_gbq 是否支持query_config 关键字arg 中的ArrayQueryParameters。这是我的解决方法:

from google.cloud import bigquery
client = bigquery.Client()

values_in_list = ['a', 'b', 'c']
query = """
SELECT
  column_A,
  column_B

FROM
  my_table

WHERE
 column_C IN UNNEST(@col_c_vals)
"""

query_params = [bigquery.ArrayQueryParameter('col_c_vals', 'STRING', values_in_list)]
job_config = bigquery.QueryJobConfig()
job_config.query_parameters = query_params
query_df = client.query(query, job_config=job_config).to_dataframe()

【讨论】:

以上是关于如果存在于列表中,则根据另一列的值选择列的主要内容,如果未能解决你的问题,请参考以下文章

pandas - 如果列标题是另一列的子字符串,则创建真/假列

根据另一列的值选择列

如果存在重复,请根据另一列选择值

如何根据另一列的值从 Spark DataFrame 中选择特定列?

如果来自一列的数据存在于另一列中,则合并两个数据框

Pyspark:如果具有特定 id 的任何行包含 null,如何根据另一列派生新列的值?