GVKun编程网logo

在对熊猫数据框索引进行排序时,“ TypeError:'DataFrame'对象是可变的,因此无法进行散列”

16

对于想了解在对熊猫数据框索引进行排序时,“TypeError:'DataFrame'对象是可变的,因此无法进行散列”的读者,本文将是一篇不可错过的文章,并且为您提供关于'DataFrame'对象是可变

对于想了解在对熊猫数据框索引进行排序时,“ TypeError:'DataFrame'对象是可变的,因此无法进行散列”的读者,本文将是一篇不可错过的文章,并且为您提供关于'DataFrame' 对象是可变的,因此它们不能用 df 作为 kwarg 进行散列、AttributeError:“ DataFrame”对象没有属性“ map”、AttributeError:无法访问“ DataFrameGroupBy”对象的可调用属性“最大”、Dataset.from_generator:TypeError:`generator`必须是可调用的的有价值信息。

本文目录一览:

在对熊猫数据框索引进行排序时,“ TypeError:'DataFrame'对象是可变的,因此无法进行散列”

在对熊猫数据框索引进行排序时,“ TypeError:'DataFrame'对象是可变的,因此无法进行散列”

我有以下数据框h

In [24]: h.head()Out[24]:                  alpha1  alpha2    gamma1  gamma2       chi2min gender  agefilename                                                                   F35_HC_532d.dat  0.0000   0.000       NaN    0.00  1.000000e+25      F   35M48_HC_551d.dat  0.7353   3.943  0.425922    0.15  2.072617e+01      M   48M24_HC_458d.dat  0.7777   4.754  0.463753    0.15  1.390893e+01      M   24M48_HC_552d.dat  0.7633   3.672  0.394370    0.15  1.965052e+01      M   48M40_HC_506d.dat  0.7793   3.271  0.513597    0.20  1.089716e+01      M   40

我正在尝试根据年龄值对数据帧索引进行排序:

In [25]: h.sort_index(h.sort_values(''age''))

这将引发错误:

TypeError: ''DataFrame'' objects are mutable, thus they cannot be hashed

我想念什么?有任何想法吗?

答案1

小编典典

那是你要的吗?

In [14]: hOut[14]:                 alpha1  alpha2    gamma1  gamma2       chi2min gender  agefilenameF35_HC_532d.dat  0.0000   0.000       NaN    0.00  1.000000e+25      F   35M48_HC_551d.dat  0.7353   3.943  0.425922    0.15  2.072617e+01      M   48M24_HC_458d.dat  0.7777   4.754  0.463753    0.15  1.390893e+01      M   24M48_HC_552d.dat  0.7633   3.672  0.394370    0.15  1.965052e+01      M   48M40_HC_506d.dat  0.7793   3.271  0.513597    0.20  1.089716e+01      M   40In [15]: h.sort_values(''age'')Out[15]:                 alpha1  alpha2    gamma1  gamma2       chi2min gender  agefilenameM24_HC_458d.dat  0.7777   4.754  0.463753    0.15  1.390893e+01      M   24F35_HC_532d.dat  0.0000   0.000       NaN    0.00  1.000000e+25      F   35M40_HC_506d.dat  0.7793   3.271  0.513597    0.20  1.089716e+01      M   40M48_HC_551d.dat  0.7353   3.943  0.425922    0.15  2.072617e+01      M   48M48_HC_552d.dat  0.7633   3.672  0.394370    0.15  1.965052e+01      M   48

'DataFrame' 对象是可变的,因此它们不能用 df 作为 kwarg 进行散列

'DataFrame' 对象是可变的,因此它们不能用 df 作为 kwarg 进行散列

如何解决''DataFrame'' 对象是可变的,因此它们不能用 df 作为 kwarg 进行散列?

我有这个功能:

def print_excel(path,filename,**kwargs):
    with pd.ExcelWriter(path + filename + timestr1 + ''.xlsx'') as writer:
        for df,sheet_name in kwargs.items():
            df.to_excel(writer,sheet_name=sheet_name,index=False)

我也有这个函数调用:

keywords = {df1: ''Sheet1'',df2:''Sheet2''}
print_excel(path1,''_FileName.xlsx'',**keywords)

然而,在调用该函数时,它给出了这个错误:

TypeError: ''DataFrame'' objects are mutable,thus they cannot be hashed

为什么会发生这种情况,我该如何解决?

解决方法

默认情况下,大多数不可变的 Python 对象是可散列的,而大多数可变对象不是。对象必须是可散列的才能用作字典键 - 您可以在此处阅读更多关于这意味着什么以及为什么会出现这种情况的信息:What does "hashable" mean in Python?。

然而,一个对象不需要成为字典,所以,在你的情况下,一个简单的解决方案就是交换键和值在你的字典里:

import pandas as pd

def print_excel(path,filename,sheet_dict):
    with pd.ExcelWriter(path + filename + timestr1 + ''.xlsx'') as writer:
        for sheet_name,df in sheet_dict.items():
            df.to_excel(writer,sheet_name=sheet_name,index=False)

sheets = {''Sheet1'': df1,''Sheet2'': df2}
print_excel(path1,''_FileName.xlsx'',sheets)

顺便说一下,我在您的函数签名中取出了字典解包(** 表示法),因为它对您的函数完全没有必要。在您的情况下,字典只是您函数的输入。关于何时在函数定义中使用 ** 表示法,有一个相关的堆栈溢出问题 here,以及关于使用元组和字典解包可以做的一些非常酷的事情的很棒的教程 here蟒蛇。

AttributeError:“ DataFrame”对象没有属性“ map”

AttributeError:“ DataFrame”对象没有属性“ map”

我想转换火花数据框架以使用以下代码添加:

from pyspark.mllib.clustering import KMeansspark_df = sqlContext.createDataFrame(pandas_df)rdd = spark_df.map(lambda data: Vectors.dense([float(c) for c in data]))model = KMeans.train(rdd, 2, maxIterations=10, runs=30, initializationMode="random")

详细的错误消息是:

---------------------------------------------------------------------------AttributeError                            Traceback (most recent call last)<ipython-input-11-a19a1763d3ac> in <module>()      1 from pyspark.mllib.clustering import KMeans      2 spark_df = sqlContext.createDataFrame(pandas_df)----> 3 rdd = spark_df.map(lambda data: Vectors.dense([float(c) for c in data]))      4 model = KMeans.train(rdd, 2, maxIterations=10, runs=30, initializationMode="random")/home/edamame/spark/spark-2.0.0-bin-hadoop2.6/python/pyspark/sql/dataframe.pyc in __getattr__(self, name)    842         if name not in self.columns:    843             raise AttributeError(--> 844                 "''%s'' object has no attribute ''%s''" % (self.__class__.__name__, name))    845         jc = self._jdf.apply(name)    846         return Column(jc)AttributeError: ''DataFrame'' object has no attribute ''map''

有人知道我在这里做错了吗?谢谢!

答案1

小编典典

您无法map使用数据框,但可以将数据框转换为RDD并通过映射将其映射spark_df.rdd.map()。在Spark
2.0之前,spark_df.map别名为spark_df.rdd.map()。使用Spark 2.0,您必须先明确调用.rdd

AttributeError:无法访问“ DataFrameGroupBy”对象的可调用属性“最大”

AttributeError:无法访问“ DataFrameGroupBy”对象的可调用属性“最大”

为什么不仅仅使用apply,因为错误消息指出:

import pandas as pd

# dataframe example
d = {'Platform': ['location','office','station'],'Date': ['01.08.2019','01.08.2019','01.08.2019'],'Visits': [4372,48176,2012]}
df = pd.DataFrame(data=d)


df.groupby(pd.Grouper(key="Date")).apply(lambda grp: grp.nlargest(2,'Visits'))

Dataset.from_generator:TypeError:`generator`必须是可调用的

Dataset.from_generator:TypeError:`generator`必须是可调用的

我最近遇到了类似的问题,但是我是初学者,所以不确定是否有帮助。

尝试在您的课程中添加一个通话函数。

下面是引发TypeError: `generator` must be callable.

的原始课程
class DataGen:
  def __init__(self,files,data_path):
    self.i = 0
    self.files=files
    self.data_path=data_path
  
  def __load__(self,files_name):
    data_path = os.path.join(self.data_path,files_name)
    arr_img,arr_mask = load_patch(data_path)
    return arr_img,arr_mask

  def getitem(self,index):
    _img,_mask = self.__load__(self.files[index])
    return _img,_mask

  def __iter__(self):
    return self

  def __next__(self):
    if self.i < len(self.files):
      img_arr,mask_arr = self.getitem(self.i)
      self.i += 1
    else:
      raise StopIteration()
    return img_arr,mask_arr

然后我修改了以下代码,它对我有用。

class DataGen:
  def __init__(self,mask_arr
  
  def __call__(self):
    self.i = 0
    return self

今天关于在对熊猫数据框索引进行排序时,“ TypeError:'DataFrame'对象是可变的,因此无法进行散列”的介绍到此结束,谢谢您的阅读,有关'DataFrame' 对象是可变的,因此它们不能用 df 作为 kwarg 进行散列、AttributeError:“ DataFrame”对象没有属性“ map”、AttributeError:无法访问“ DataFrameGroupBy”对象的可调用属性“最大”、Dataset.from_generator:TypeError:`generator`必须是可调用的等更多相关知识的信息可以在本站进行查询。

本文标签: