TypeError: unhashable type: 'numpy.ndarray' 合并来自 BigQuery 的 pandas 数据帧时

Posted

技术标签:

【中文标题】TypeError: unhashable type: \'numpy.ndarray\' 合并来自 BigQuery 的 pandas 数据帧时【英文标题】:TypeError: unhashable type: 'numpy.ndarray' when merging pandas datframes from BigQueryTypeError: unhashable type: 'numpy.ndarray' 合并来自 BigQuery 的 pandas 数据帧时 【发布时间】:2019-08-17 22:28:05 【问题描述】:

我从 BigQuery 上的开放数据 Github 数据创建了一个 BigQuery 数据集。

我现在将这些数据(两个不同的表)作为数据框带入 pandas,它工作正常。当我在我的联接列上调用“类型”时,它们都以 pd.Series 的形式出现。

这是我的脚本:

from google.cloud import bigquery
from google.oauth2 import service_account
from google.cloud import bigquery_storage_v1beta1
from sklearn.model_selection import train_test_split
import pandas as pd

credentials = service_account.Credentials.from_service_account_file(
    'XXXXXXXXX.json')
project_id = 'XXXXXX'
client = bigquery.Client(credentials= credentials, project=project_id)

bqstorageclient = bigquery_storage_v1beta1.BigQueryStorageClient(
    credentials=credentials
)


language_query = """
  SELECT repo_name, Language, Bytes,
  CASE 
  when LOWER(Language) NOT IN ('javascript', 'python', 'ruby', 'java'
                        , 'php', 'c++', 'css', 'c#', 'go'
                        , 'c', 'typescript', 'shell', 'swift'
                        , 'scala', 'objective-c') then 'Other'
  else Language END AS language_category
  FROM github_project.langauges

  LIMIT 1000"""

language_query_dataframe = (
    client.query(language_query)
    .result()
    .to_dataframe(bqstorage_client=bqstorageclient)
)

commit_query = """
    SELECT Commit, Author, DateSeconds, repo_name
    FROM github_project.commits
    LIMIT 1000
    """

commit_query_dataframe = (
    client.query(commit_query)
    .result()
    .to_dataframe(bqstorage_client=bqstorageclient)
)

merged_data = pd.merge(commit_query_dataframe, language_query_dataframe, on='repo_name')

最后一行,

merged_data = pd.merge(commit_query_dataframe, language_query_dataframe, on='repo_name')

抛出错误:

TypeError: unhashable type: 'numpy.ndarray'

数组来自哪里?我找不到答案,也不明白为什么合并两个系列会解决这个问题。

任何帮助都会很棒。提前致谢

【问题讨论】:

commit_query_dataframelanguage_query_dataframe的形状是什么? @MdJohirulIslam np.shape 为两者提供 (1000,4) 并且 type 为 repo_name 提供'pandas.core.series.Series' 【参考方案1】:

我发现了问题——它在 BigQuery 方面。 repo_name 是 BigQuery 表中的一个数组,我错过了它,因此在我的原始查询中使用 UNNEST 解决了这个问题。

留给遇到这种情况的其他人。检查并确保您的联接列在 BigQuery 上不是“重复”类型。

【讨论】:

很酷,你想通了。给别人留下这样的答案很有帮助。

以上是关于TypeError: unhashable type: 'numpy.ndarray' 合并来自 BigQuery 的 pandas 数据帧时的主要内容,如果未能解决你的问题,请参考以下文章

如何克服 TypeError: unhashable type: 'list'

Python debug——TypeError unhashable type(list/set/dict)

这里的正确语法是啥?获取类型 TypeError: unhashable type: 'dict

Python "TypeError: unhashable type: 'slice'" 用于编码分类数据

TypeError: unhashable type: 'list' 在 python 中使用 groupby 时

TypeError: unhashable type: 'numpy.ndarray'