ValueError: operands could not be broadcast together with shape when calling pands value_counts() on groupby object
ValueError: operands could not be broadcast together with shape when calling pands value_counts() on groupby object
我知道有很多关于此错误消息的问题。但是我还没有找到有这个确切问题的人。
我正在尝试对 pandas DataFrame 进行分组并计算值:
allfactor = dataframe.groupby(factor)[reference_area].value_counts()
其中 factor 和 reference_area 是 dataframe.This 中的列名,适用于某些列,例如 DGD015,但不适用于其他一些列,包括 factor。
它给了我错误:
ValueError: operands could not be broadcast together with shape (421,) (419,)
我会把完整的错误信息放在这个问题的最后。
分组本身有效:
In: grouped = data.groupby(factor)[reference_area]
grouped
Out: <pandas.core.groupby.generic.SeriesGroupBy object at 0x0000000B39D0F5F8>
我可以看出这是一个 numpy 广播错误,因为维度的形状不同。并且有解决方法,例如在尝试乘以不 "fit" 并且可以从中拉伸 none 的维度时使用 [:, np.newaxis]
(Research Computing for Earth Sciences) or [:,None]
(How to think like a Computer Scientist: Learning with Python 3)。
但是在numpy中调用pandas出错的时候不知道怎么办,调用value_counts().
有人知道这里的解决方法吗?
我如何在这里访问 numpy 以告诉它只添加包含 NAN 的新轴以使尺寸合适?
完整的错误信息如下:
ValueError Traceback (most recent call last)
ipython-input-5-013b5262b34f> in module>()
----> 1 trial = get_positives_threshold(data, 'SHB23D', 'HV001', threshold=90)
2 print(trial)
ipython-input-3-80d69965e883> in get_positives_threshold(dataframe, factor, reference_area, threshold)
---> 33 allfactor = dataframe.groupby(factor)[reference_area].value_counts()
~\Documents\anaconda3\lib\site-packages\pandas\core\groupby\generic.py in value_counts(self, normalize, sort, ascending, bins, dropna)
-> 1139 labels = list(map(rep, self.grouper.recons_labels)) + [llab(lab, inc)]`
`~\Documents\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in repeat(a, repeats, axis)
421 repeated_array : ndarray
422 Output array which has the same shape as a, except along
--> 423 the given axis.
~\Documents\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
50 try:
51 return getattr(obj, method)(*args, **kwds)
---> 52
53 # An AttributeError occurs if the object does not have
54 # such a method in its class.`
ValueError: operands could not be broadcast together with shape (421,) (419,)
这里有一些关于数据框的信息:
最初是一个 .sav SPSS 文件,被转换为一个羽毛文件。然后使用 pandas.read_feather(path_to_file) 读入。
所有列的数据都是分类的。大多数列的原始值包含 NaN、作为字符串的整数和字符串,但所有这些都存储为分类类型。
reference_area HV002 HV003 [...] DGD015 [...] factor [...]
1 '10001' 'NaN' 'Yes' [...] 'Refused' [...] '90' [...]
2 '10001' 'No' 'NaN' [...] '140' [...] '80' [...]
3 '24736' 'Yes' 'No' [...] '78' [...] 'Nan' [...]
4 '24736' 'Yes' 'No' [...] 'Other' [...] 'Technical Problem'
值是有代表性的,但混合在一起,并且列名已更改以掩盖原始数据。
Pandas 版本 0.24.1
Numpy 版本 1.15.4
Python 版本 3.6.5
在我的环境中使用上述版本在 jupyter notebook 中使用 Anaconda 3。
预期输出:
In: dataframe.groupby(factor)[reference_area].value_counts()
Out: factor reference_area
0 121640.0 1
1 52675.0 1
181826.0 1
10 40812.0 1
340804.0 2
360756.0 1
100 70679.0 18
70251.0 14
70019.0 13
70728.0 11
120070.0 11
..
Refused 90008.0 1
问题似乎与未观察到的类别有关。来自 pandas 关于 groupby 的文档:
When using a Categorical grouper (as a single grouper, or as part of multiple groupers), the observed keyword controls whether to return a cartesian product of all possible groupers values (observed=False) or only those that are observed groupers (observed=True).
在我的特定情况下计算笛卡尔积最终会导致广播错误。这就是为什么有些列有效而其他列无效的原因:那些有效的列没有任何未观察到的类别,而那些无效的列则有未观察到的类别。
为避免出现此问题,请在分组时设置 observed = True
。这意味着 groupby
将仅使用观察到的类别(即存在条目的那些类别)。在我的例子中是:
allfactor = dataframe.groupby(factor, observed=True)[reference_area].value_counts()
据我的测试显示,这不会导致丢失数据框的条目以供进一步分析。没有未观察到的类别的条目(甚至没有 NaN 值),因此我们在仅使用观察到的类别时不会丢失任何条目。不过请注意,如果您确实想分析这些未观察到的类别,这不是您要寻找的解决方案。
我知道有很多关于此错误消息的问题。但是我还没有找到有这个确切问题的人。
我正在尝试对 pandas DataFrame 进行分组并计算值:
allfactor = dataframe.groupby(factor)[reference_area].value_counts()
其中 factor 和 reference_area 是 dataframe.This 中的列名,适用于某些列,例如 DGD015,但不适用于其他一些列,包括 factor。
它给了我错误:
ValueError: operands could not be broadcast together with shape (421,) (419,)
我会把完整的错误信息放在这个问题的最后。
分组本身有效:
In: grouped = data.groupby(factor)[reference_area]
grouped
Out: <pandas.core.groupby.generic.SeriesGroupBy object at 0x0000000B39D0F5F8>
我可以看出这是一个 numpy 广播错误,因为维度的形状不同。并且有解决方法,例如在尝试乘以不 "fit" 并且可以从中拉伸 none 的维度时使用 [:, np.newaxis]
(Research Computing for Earth Sciences) or [:,None]
(How to think like a Computer Scientist: Learning with Python 3)。
但是在numpy中调用pandas出错的时候不知道怎么办,调用value_counts().
有人知道这里的解决方法吗?
我如何在这里访问 numpy 以告诉它只添加包含 NAN 的新轴以使尺寸合适?
完整的错误信息如下:
ValueError Traceback (most recent call last)
ipython-input-5-013b5262b34f> in module>()
----> 1 trial = get_positives_threshold(data, 'SHB23D', 'HV001', threshold=90)
2 print(trial)
ipython-input-3-80d69965e883> in get_positives_threshold(dataframe, factor, reference_area, threshold)
---> 33 allfactor = dataframe.groupby(factor)[reference_area].value_counts()
~\Documents\anaconda3\lib\site-packages\pandas\core\groupby\generic.py in value_counts(self, normalize, sort, ascending, bins, dropna)
-> 1139 labels = list(map(rep, self.grouper.recons_labels)) + [llab(lab, inc)]`
`~\Documents\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in repeat(a, repeats, axis)
421 repeated_array : ndarray
422 Output array which has the same shape as a, except along
--> 423 the given axis.
~\Documents\anaconda3\lib\site-packages\numpy\core\fromnumeric.py in _wrapfunc(obj, method, *args, **kwds)
50 try:
51 return getattr(obj, method)(*args, **kwds)
---> 52
53 # An AttributeError occurs if the object does not have
54 # such a method in its class.`
ValueError: operands could not be broadcast together with shape (421,) (419,)
这里有一些关于数据框的信息:
最初是一个 .sav SPSS 文件,被转换为一个羽毛文件。然后使用 pandas.read_feather(path_to_file) 读入。 所有列的数据都是分类的。大多数列的原始值包含 NaN、作为字符串的整数和字符串,但所有这些都存储为分类类型。
reference_area HV002 HV003 [...] DGD015 [...] factor [...]
1 '10001' 'NaN' 'Yes' [...] 'Refused' [...] '90' [...]
2 '10001' 'No' 'NaN' [...] '140' [...] '80' [...]
3 '24736' 'Yes' 'No' [...] '78' [...] 'Nan' [...]
4 '24736' 'Yes' 'No' [...] 'Other' [...] 'Technical Problem'
值是有代表性的,但混合在一起,并且列名已更改以掩盖原始数据。
Pandas 版本 0.24.1
Numpy 版本 1.15.4
Python 版本 3.6.5
在我的环境中使用上述版本在 jupyter notebook 中使用 Anaconda 3。
预期输出:
In: dataframe.groupby(factor)[reference_area].value_counts()
Out: factor reference_area
0 121640.0 1
1 52675.0 1
181826.0 1
10 40812.0 1
340804.0 2
360756.0 1
100 70679.0 18
70251.0 14
70019.0 13
70728.0 11
120070.0 11
..
Refused 90008.0 1
问题似乎与未观察到的类别有关。来自 pandas 关于 groupby 的文档:
When using a Categorical grouper (as a single grouper, or as part of multiple groupers), the observed keyword controls whether to return a cartesian product of all possible groupers values (observed=False) or only those that are observed groupers (observed=True).
在我的特定情况下计算笛卡尔积最终会导致广播错误。这就是为什么有些列有效而其他列无效的原因:那些有效的列没有任何未观察到的类别,而那些无效的列则有未观察到的类别。
为避免出现此问题,请在分组时设置 observed = True
。这意味着 groupby
将仅使用观察到的类别(即存在条目的那些类别)。在我的例子中是:
allfactor = dataframe.groupby(factor, observed=True)[reference_area].value_counts()
据我的测试显示,这不会导致丢失数据框的条目以供进一步分析。没有未观察到的类别的条目(甚至没有 NaN 值),因此我们在仅使用观察到的类别时不会丢失任何条目。不过请注意,如果您确实想分析这些未观察到的类别,这不是您要寻找的解决方案。