【问题标题】:pandas group by confusion -- unhashable typepandas group by混淆——不可散列的类型
【发布时间】:2017-01-04 07:02:30
【问题描述】:

使用 Pandas 数据框按功能分组,我想按列 c_b 分组并计算列 c_a 和列 c_c 的唯一计数。我的预期结果是,

预期结果

c_b,c_a_unique_count,c_c_unique_count
python,2,2
c++,2,2

遇到关于unhashable type 的奇怪错误,有人有什么想法吗?谢谢。

输入文件

c_a,c_b,c_c,c_d
hello,python,numpy,0.0
hi,python,pandas,1.0
ho,c++,vector,0.0
ho,c++,std,1.0
go,c++,std,0.0

源代码

sample = pd.read_csv('123.csv', header=None, skiprows=1,
    dtype={0:str, 1:str, 2:str, 3:float})
sample.columns = pd.Index(data=['c_a', 'c_b', 'c_c', 'c_d'])
sample['c_d'] = sample['c_d'].astype('int64')
sampleGroup = sample.groupby('c_b')
results = sampleGroup.count()[:,[0,2]]
results.to_csv(derivedFeatureFile, index= False)

错误信息

Traceback (most recent call last):
  File "/Users/foo/personal/featureExtraction/kaggleExercise.py", line 134, in <module>
    unitTest()
  File "/Users/foo/personal/featureExtraction/kaggleExercise.py", line 129, in unitTest
    results = sampleGroup.count()[:,[0,2]]
  File "/Users/foo/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 1997, in __getitem__
    return self._getitem_column(key)
  File "/Users/foo/miniconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 2004, in _getitem_column
    return self._get_item_cache(key)
  File "/Users/foo/miniconda2/lib/python2.7/site-packages/pandas/core/generic.py", line 1348, in _get_item_cache
    res = cache.get(item)
TypeError: unhashable type

【问题讨论】:

  • sampleGroup.count()[:,[0,2]] 你想在这里做什么?如果您想获取第一列和第三列,请尝试将其更改为sampleGroup.count().iloc[:,[0,2]](您也可以在 groupby 对象上执行此操作)。 (df.groupby('a')[[0, 2]].count())
  • 感谢@ayhan,您的方法有效,但结果似乎只有c_ac_d 列,也许我认为是错误的——我认为c_b 是自动包含的,因为它是分组依据所在的列,c_a,c_d 3,3 2,2
  • 是分组列成为索引。您也可以通过标签访问这些列。预期的输出是什么?
  • @ayhan,我在帖子的开头部分发布了我的预期结果,并且我希望输出组列值本身(在我的示例中,它是列c_b 的值,并且是唯一的计算列 c_ac_c)。如果您有任何解决方案,那就太好了。
  • 对不起,我错过了。我发布了一个答案,没有将c_b 作为索引。

标签: python python-2.7 pandas dataframe group-by


【解决方案1】:

对于每个组中唯一元素的数量,您可以使用:

df.groupby('c_b')['c_a', 'c_d'].agg(pd.Series.nunique)

df.groupby('c_b')['c_a', 'c_d'].agg(pd.Series.nunique)
Out: 
        c_a  c_d
c_b             
c++       2    2
python    2    2

df.groupby('c_b', as_index=False)['c_a', 'c_d'].agg(pd.Series.nunique)
Out: 
      c_b  c_a  c_d
0     c++    2    2
1  python    2    2

【讨论】:

  • 谢谢ayhan,最后两个例子的区别在于是否有额外的整数增量列?
  • 感谢 ayhan 的帮助,将您的回复标记为答案。
  • 这是数据框的索引。在第一个中,索引是c_b
  • 谢谢 ayhan,所以在你的第一个例子中,(1)c_b 不是一个列,它是一个索引,在第二个例子中,c_b 是一个列,而不是一个索引 - - 一个整数列创建索引,对吗? (2) 为什么一定要有索引?
  • 没错。索引是一种区分行并使访问更容易/更快的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多