【问题标题】:TypeError: 'Series' objects are mutable, thus they cannot be hashedTypeError:“系列”对象是可变的,因此它们不能被散列
【发布时间】:2017-02-28 09:09:40
【问题描述】:

我知道这个错误很常见,我尝试了一些我查找的解决方案,但仍然无法理解问题所在。我猜这是由于 row 和 row1 的可变形式,但我想不通

我想做什么? 我有 2 个数据框。我需要遍历第一个 1 的行,并且对于第一个行的每一行遍历第二个行并检查某些列的单元格的值。 我的代码和不同的尝试:

a=0
b=0
  for row in Correction.iterrows():
        b+=1
        for row1 in dataframe.iterrows():
            c+=1
            a=0
            print('Handling correction '+str(b)+' and deal '+str(c))
            if (Correction.loc[row,['BO Branch Code']]==dataframe.loc[row1,['wings Branch']] and Correction.loc[row,['Profit Center']]==dataframe.loc[row1,['Profit Center']] and Correction.loc[row,['Back Office']]==dataframe.loc[row1,['Back Office']]
                and Correction.loc[row,['BO System Code']]==dataframe.loc[row1,['BO System Code']]):

我也试过了

a=0
b=0
 for row in Correction.iterrows():
        b+=1
        for row1 in dataframe.iterrows():
            c+=1
            a=0
            print('Handling correction '+str(b)+' and deal '+str(c))
            if (Correction[row]['BO Branch Code']==dataframe[row1]['wings Branch'] and Correction[row]['Profit Center']==dataframe[row1]['Profit Center'] and Correction[row]['Back Office']==dataframe[row1]['Back Office']
                and Correction[row]['BO System Code']==dataframe[row1]['BO System Code']):

还有

a=0
b=0
 for row in Correction.iterrows():
        b+=1
        for row1 in dataframe.iterrows():
            c+=1
            a=0
            print('Handling correction '+str(b)+' and deal '+str(c))
            if (Correction.loc[row,['BO Branch Code']]==dataframe[row1,['wings Branch']] and Correction[row,['Profit Center']]==dataframe[row1,['Profit Center']] and Correction[row,['Back Office']]==dataframe[row1,['Back Office']]
                and Correction[row,['BO System Code']]==dataframe[row1,['BO System Code']]):

【问题讨论】:

    标签: python pandas hash immutability


    【解决方案1】:

    我通过更改我的 for 循环找到了解决方法 现在我的代码是:

    a=0
    b=0
     for index in Correction.index:
            b+=1
            for index1 in dataframe.index:
                c+=1
                a=0
                print('Handling correction '+str(b)+' and deal '+str(c))
                if (Correction.loc[row,'BO Branch Code']==dataframe.loc[row1,'Wings Branch]] and Correction.loc[row,'Profit Center']==dataframe.loc[row1,'Profit Center'] and Correction.loc[row,'Back Office']==dataframe.loc[row1,'Back Office']
                    and Correction.loc[row,'BO System Code']==dataframe.loc[row1,'BO System Code']):
    

    【讨论】:

      【解决方案2】:

      我认为你迭代你的 df 错误

      for row in Correction.itertuples():
          bo_branch_code = row['BO Branch Code']
          for row1 in dataframe.itertuples():
              if row1['wings Branch'] == bo_branch_code:
                  # do stuff here
      

      参考如何迭代DataFrame:https://github.com/vi3k6i5/pandas_basics/blob/master/2.A%20Iterate%20over%20a%20dataframe.ipynb

      我为您的 index 方法和 iteraterows 方法计时。结果如下:

      import pandas as pd
      import numpy as np
      import time
      
      df = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD'))
      
      df_2 = pd.DataFrame(np.random.randint(0,100,size=(10, 4)), columns=list('ABCD'))
      
      def test_time():
          for index in df.index:
              for index1 in df_2.index:
                  if (df.loc[index, 'A'] == df_2.loc[index1, 'A']):
                      continue
      
      def test_time_2():
          for idx, row in df.iterrows():
              a_val = row['A']
              for idy, row_1 in df_2.iterrows():
                  if (a_val == row_1['A']):
                      continue
      
      start= time.clock()
      test_time()
      end= time.clock()
      print(end-start)
      # 0.038514999999999855
      
      start= time.clock()
      test_time_2()
      end= time.clock()
      print(end-start)
      # 0.009272000000000169
      

      简单地说 iterrows 比你的方法快。

      关于循环数据帧What is the most efficient way to loop through dataframes with pandas?的好方法的参考

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-26
        • 2021-01-17
        相关资源
        最近更新 更多