我正在尝试转换为分类值并在pandas中进行分组。
例如,我尝试了以下内容:
import pandas as pd
df = pd.DataFrame()
df['A'] = ['C1', 'C1', 'C2', 'C2', 'C3', 'C3']
df['B'] = [1,2,3,4,5,6]
df['A'] = df.loc[:,'A'].astype('category')
df2 = df[0:3]
result = df2.groupby(by='A')['B'].nunique()
print(result)
不幸的是,我得到了例外
文件“C:\ Python34 \ lib \ site-packages \ pandas \ core \ internals.py”,第86行, init len(self.values),len(self.mgr_locs)))
ValueError:传递的项目数量错误2,展示位置意味着3
修改 不幸的是,@ jois提出的解决方法对我的应用程序不起作用。新的反例:
import pandas as pd
df = pd.DataFrame()
df['A'] = ['C1', 'C1', 'C2', pd.np.nan, 'C3', 'C3']
df['B'] = [1,2,3,4,5,6]
df['A'] = df.loc[:,'A'].astype('category')
df2 = df[0:4]
df2['A'] = df2['A'].cat.remove_unused_categories()
result = df2.groupby(by='A')['B'].nunique()
print(result)
答案 0 :(得分:0)
正如评论中所提到的,这是pandas 0.17.0的回归,并在此报告:https://github.com/pydata/pandas/issues/11635
作为现在的解决方法,您可以通过nunique
轻松使用apply
系列方法,而不是直接在groupby对象上调用它:
In [22]: df2.groupby(by='A')['B'].apply(lambda x: x.nunique())
Out[22]:
A
C1 2
C2 1
C3 0
Name: B, dtype: int64
您遇到remove_unused_categories()
的另一个问题也是一个错误,这将在0.17.1中修复(https://github.com/pydata/pandas/pull/11639)