--已编辑--
我遵循在Kaggle上找到的关于多标签类别预测的脚本:https://www.kaggle.com/rodsaldanha/multilabel-category-prediction
我目前在命令行344,这是探索性分析部分的一部分:
bar_plot = pd.DataFrame()
bar_plot['cat'] = description_category.columns[1:]
bar_plot['count'] = description_category.iloc[:,1:].sum().values
bar_plot.sort_values(['count'], inplace=True, ascending=False)
bar_plot.reset_index(inplace=True, drop=True)
bar_plot.head()
输出应该是这样的:
cat count
0 International Movies 1927
1 Dramas 1623
2 Comedies 1113
3 International TV Shows 1001
4 Documentaries 668
然而,我在命令的特定部分出现了这个错误:
bar_plot['count'] = description_category.iloc[:,1:].sum().values
错误低于
ValueError Traceback (most recent call last)
<ipython-input-70-76549b4c5547> in <module>
----> 1 bar_plot['count'] = description_category.iloc[:,1:].sum().values
C:Anacondaenvsnlp_courselibsite-packagespandascoreframe.py in __setitem__(self, key, value)
3117 else:
3118 # set column
-> 3119 self._set_item(key, value)
3120
3121 def _setitem_slice(self, key, value):
C:Anacondaenvsnlp_courselibsite-packagespandascoreframe.py in _set_item(self, key, value)
3192
3193 self._ensure_valid_index(value)
-> 3194 value = self._sanitize_column(key, value)
3195 NDFrame._set_item(self, key, value)
3196
C:Anacondaenvsnlp_courselibsite-packagespandascoreframe.py in _sanitize_column(self, key, value, broadcast)
3389
3390 # turn me into an ndarray
-> 3391 value = _sanitize_index(value, self.index, copy=False)
3392 if not isinstance(value, (np.ndarray, Index)):
3393 if isinstance(value, list) and len(value) > 0:
C:Anacondaenvsnlp_courselibsite-packagespandascoreseries.py in _sanitize_index(data, index, copy)
3999
4000 if len(data) != len(index):
-> 4001 raise ValueError('Length of values does not match length of ' 'index')
4002
4003 if isinstance(data, ABCIndexClass) and not copy:
ValueError: Length of values does not match length of index
我该怎么解决?谢谢
我的第一个答案不正确。再看一遍,我怀疑数据帧description_category
至少有一列不能求和,因此.sum()
创建的结果与要求的长度不匹配。我想你会遇到这样的情况:
df = pd.DataFrame({'A': [1, 2], 'B': [3, 4], 'C': [5, 6], 'D': [7, '8']})
A B C D
0 1 3 5 7
1 2 4 6 8
在df
中,不能对列D
求和,因为其中有一些项的类型无法求和(int
和str
(。在您的情况下,可能还有其他原因,即列具有根本不可求和的类型的元素(如dict
等(
如果你看看
print(df.columns[1:])
print(df.iloc[:, 1:].sum().values)
你会得到类似的东西
Index(['B', 'C', 'D'], dtype='object')
[ 7, 11]
两个不同长度的物体!.sum
只是忽略了列D
,因为它无法汇总它的元素,也不会抱怨它
现在,如果你尝试类似于你在做的事情
df_new = pd.DataFrame()
df_new['col_1'] = df.columns[1:]
try:
df_new['col_2'] = df.iloc[:, 1:].sum().values
except ValueError as val_err:
print(val_err)
你会得到类似的东西
ValueError('Length of values (2) does not match length of index (3)')
这几乎就是你得到的错误信息。
补救措施:很难说。首先查看description_category.columns[1:]
和description_category.iloc[:,1:].sum().values
以确认这确实发生了。然后在description_category
中查找导致问题的列/数据。然后回顾数据生成过程,并确定这是如何产生的。或者直接尝试转换导致问题的列。kaggle项目的数据似乎不再可用:你的数据来自哪里?