将数据帧中的值与iloc相加



--已编辑--

我遵循在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求和,因为其中有一些项的类型无法求和(intstr(。在您的情况下,可能还有其他原因,即列具有根本不可求和的类型的元素(如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项目的数据似乎不再可用:你的数据来自哪里?

最新更新