【问题标题】:pd.merge gives error: DataFrame' objects are mutable, thus they cannot be hashedpd.merge 给出错误:DataFrame' 对象是可变的,因此它们不能被散列
【发布时间】:2020-07-14 11:17:07
【问题描述】:

我有一个数据帧 dfCM,它是从另一个数据帧 dfdict[dfCM] 创建的,然后按如下方式处理:

  1. 删除了不需要的行。
  2. 删除了不需要的列
  3. 添加了新列。

我现在需要将删除的列从 dfdict[dfCM] 添加回 dfCM。请注意,dfdict[dfCM] 保存在数据帧字典中。

我之前在我的代码中多次运行类似的合并命令,但现在我收到错误:DataFrame' 对象是可变的,因此它们不能被散列

#add back deleted dfCM columns 
dfCM = pd.merge(dfCM, dfdict[dfCM], on=['ClaimID'], how = 'left', suffixes = ('', '_cm')) 
#remove duplicate columns
dfCM.filter(like='_cm',axis=1)

这就是 dfCM 的样子(有更多的列和行):

index ClaimID                 MeasCode  MeasAppType
0     MCE-2019-02-02-068-01     CLA48   AR  
1     MCE-2019-02-066-01        CLA48   AR  
2     MCE-2019-02-066-01B       CLA48   AR  
3     MCE-2019-02-066-02        CLB50   AR  
4     MCE-2019-02-066-02B       CLB50   AR  
5     MCE-2019-02-067-01        CLB51   AR  

下面是dfdict的截图:

这就是 dfdict[dfCM] 的样子(有更多的行和列):

index   ClaimID                 MeasAppType  MeasDesc
0       BAY-2019_C&S_19Q1       AR           Attic insulation; Domestic hot water heater/boiler; 
1       BAY-2019_COM_19Q1       AR           Attic insulation; Domestic hot water heater/boiler; 
2       BAY-2019_Com_Q2         NR           This record is not a project
3       BAY-2019_CS_Q2          NR           This record is not a project
4       BAY-2019_EM&V_19Q1      AR           Attic insulation; Domestic hot water heater/boiler; 

我可以通过更改 dfdict[dfCM] 中的所有列名来进行合并,如下所示。但这并不理想,因为现在我无法区分添加到 dfCM 的重复列和唯一列,因此无法删除重复项。

    #add back deleted dfCM columns
    dfdict['dfCM'] = dfdict['dfCM'].add_suffix('_cm') #identified columns from dfCL
    dfCM = pd.merge(dfCM, dfdict['dfCM'], left_on='ClaimID', right_on='ClaimID_cm', how = 'left', suffixes = ('', '_cm'))

有没有更好的方法来解决这个问题?谢谢

【问题讨论】:

  • dfdict 是字典吗?如果是这样,并且dfCM 是一个数据框,那么你不能将它用作字典键,因为它是可变的,正如错误告诉你的那样
  • 我尝试创建一个新的 df,a = dfdict[dfCM],然后使用 a 而不是 dfdict[dfCM],但得到了同样的错误。你对如何解决这个问题有什么建议吗?
  • a = dfdict[dfCM] 是否会出现该错误?

标签: python pandas dataframe merge


【解决方案1】:

您需要解释如何创建dfdict,因为您试图将数据框用作您无法做到的字典的键:

import pandas as pd
df1 = pd.DataFrame()
df2 = pd.DataFrame()
dfdict = {df1: 1, df2: 2}
Traceback (most recent call last):
  File "/Users/dgolding/PycharmProjects/team-general-wikis/venv/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-5-3207e8fd0e73>", line 1, in <module>
    {df1: 1, df2: 2}
  File "/Users/dgolding/PycharmProjects/team-general-wikis/venv/lib/python3.6/site-packages/pandas/core/generic.py", line 1887, in __hash__
    " hashed".format(self.__class__.__name__)
TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed

也许您的字典键实际上是数据框变量名称的字符串?在这种情况下,当您尝试使用数据框作为键来获取值时,您会收到该错误:

dfdict = {"df1": df1, "df2": df2}
dfdict[df1]
Traceback (most recent call last):
  File "/Users/dgolding/PycharmProjects/team-general-wikis/venv/lib/python3.6/site-packages/IPython/core/interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-7-825e4ae2577b>", line 1, in <module>
    dfdict[df1]
  File "/Users/dgolding/PycharmProjects/team-general-wikis/venv/lib/python3.6/site-packages/pandas/core/generic.py", line 1887, in __hash__
    " hashed".format(self.__class__.__name__)
TypeError: 'DataFrame' objects are mutable, thus they cannot be hashed

也许您正在尝试这样做:dfdict["dfCM"]

【讨论】:

  • 天哪!是的,我错过了引号!多么愚蠢的错误!感谢您的帮助,丹。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2021-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多