pd.merge выдает ошибку: объекты DataFrame изменяемы, поэтому их нельзя хэшировать - PullRequest
0 голосов
/ 14 июля 2020

У меня есть фрейм данных, dfCM, который был создан из другого фрейма данных, dfdict [dfCM], а затем обработан следующим образом:

  1. ненужные строки были удалены.
  2. не нужны столбцы были удалены
  3. добавлены новые столбцы.

Теперь мне нужно добавить обратно удаленные столбцы из dfdict [dfCM] в dfCM. Обратите внимание, что dfdict [dfCM] сохраняется в словаре фреймов данных.

Раньше я запускал аналогичную команду слияния в своем коде несколько раз, но теперь я получаю сообщение об ошибке: DataFrame 'objects являются изменяемыми, поэтому их нельзя хешировать

#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

А вот как выглядит 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'))

Есть ли лучший способ решить эту проблему? Спасибо

1 Ответ

1 голос
/ 14 июля 2020

Вам нужно будет объяснить, как вы создаете 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"]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...