Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:'numpy.ndarray'
Posted
技术标签:
【中文标题】Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:\'numpy.ndarray\'【英文标题】:Python : Outer join or merge of two dataframes gives the error : TypeError: unhashable type: 'numpy.ndarray'Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:'numpy.ndarray' 【发布时间】:2022-01-10 19:55:53 【问题描述】:我正在加入两个数据帧 digiplay_video_services_t 和 dsr_conflict_df。
common_cols = ['region', 'management_area', 'rf_line_up_name', 'site', 'frequency_name', 'sdv_site', 'bandwidth_spectrum_width', 'qam_rf_label']
dsr_digiplay_conflicts = pd.merge(digiplay_video_services_t, dsr_conflict_df,
left_on = common_cols + ['reference_lcm_name', 'dwnstrm_plant', 'frequency', 'eia', 'source_id'],
right_on = common_cols + ['reference_lcm_name', 'dwnstrm_plant', 'frequency', 'eia', 'source_id'], how = 'outer', indicator = True)
我收到以下错误,这里给出了堆栈跟踪。
Traceback (most recent call last):
File "task_3_build_wt_video_services.py", line 1141, in <module>
main()
File "task_3_build_wt_video_services.py", line 624, in main
how = 'outer', indicator = True)
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 89, in merge
return op.get_result()
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 668, in get_result
join_index, left_indexer, right_indexer = self._get_join_info()
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 884, in _get_join_info
(left_indexer, right_indexer) = self._get_join_indexers()
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 863, in _get_join_indexers
self.left_join_keys, self.right_join_keys, sort=self.sort, how=self.how
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 1328, in _get_join_indexers
zipped = zip(*mapped)
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 1326, in <genexpr>
for n in range(len(left_keys))
File "/var/lib/airflow/venv/lib/python3.6/site-packages/pandas/core/reshape/merge.py", line 1974, in _factorize_keys
rlab = rizer.factorize(rk)
File "pandas/_libs/hashtable.pyx", line 96, in pandas._libs.hashtable.Factorizer.factorize
File "pandas/_libs/hashtable_class_helper.pxi", line 1880, in pandas._libs.hashtable.PyObjectHashTable.get_labels
File "pandas/_libs/hashtable_class_helper.pxi", line 1787, in pandas._libs.hashtable.PyObjectHashTable._unique
TypeError: unhashable type: 'numpy.ndarray'
我正在使用 Python 3.6 和 pandas 1.1.2。
【问题讨论】:
列中是否包含数组? 我正在添加代码来检查两个数据帧中的任何元素是否是数组。但我的猜测是它们不包含数组 你知道所有列的dtypes
吗?使用 object dtype 可以在一列中有一个独立的数组(或列表),但通常一列完全由数组组成。 您需要以一种方式或其他方式了解框架的内容。我们只能猜测。
我打印了两个数据框中所有列的 dtypes。我可以看到对象数据类型。我没有看到任何数组类型。我打印了帧的内容,但数据帧很大。 '''
【参考方案1】:
这是我的理论。
Pandas 库使用所有索引和列的哈希值,因此您必须为其提供不可变(哈希)变量但 np.array
是可变的(更多关于可变和不可变 here)。用于检查变量是否可散列
try:
hash(the_varible)
except TypeError:
print( "It's unhashable.")
else:
print( "It's hashable.")
【讨论】:
谢谢!!!所以,我会检查数据帧中的所有列。是否有一段代码如何检查?? 我使用以下代码片段来查找不可散列的值。但它什么也没找到。 '''for idx, row in digiplay_video_services_t.iterrows(): for i in columns: try: hash(row.loc[i]) except TypeError: print("unhashable value :" + str(row.loc[i]) )'''。我做错什么了吗?? 您是否针对上述循环破解了dsr_conflict_df
? @user1634050
我使用下面的代码在两个数据框中找到了空数组。我发现 dsr_conflict_df 数据帧中存在空数组,并将其替换为 None。 ''' for col in cols2: for row in range(len(dsr[col])): if type(dsr[col][row]) == ndarray: print(col, row, dsr[col][row] ) ''' 我使用以下代码行来修复它。 '''dsr['qam_rf_label'] = dsr['qam_rf_label'].apply(lambda x: None if type(x) == ndarray else x)'''
请添加允许我们重现错误@user1634050的代码和数据部分以上是关于Python:两个数据帧的外部连接或合并给出错误:TypeError:unhashable type:'numpy.ndarray'的主要内容,如果未能解决你的问题,请参考以下文章