【问题标题】:For-Loop Index KeyError when trying to get sums尝试获取总和时的 For-Loop Index KeyError
【发布时间】:2019-09-12 07:42:17
【问题描述】:

我想找出特定分类的变量的总和。我的变量 a 是(CM)分类,另一个是浮点数(zahlgesnet)。我遇到了一个错误,我无法真正认识自己是怎么回事。

这实际上是计算一个混淆矩阵输出的总和。到目前为止,我尝试使用不同的方法,但我想知道为什么这种方法不起作用。由于我是python初学者,我不确定这个方法是否整体合适。

这是数据的样子:

  ID zahlgesnet CM 

1 1  2.234,42   0
3 2  0          3
4 3  234        0
6 4  8.234      2
7 5  653,23     1  
9 6  134        2 

这是我的代码:

SummeFF = 0
SummeFT = 0
SummeTF = 0
SummeTT = 0
result = 0

def getsums(x,y,z,v):
    for i in range(len(X_valid)):
        if X_valid.CM[i] == 0:
            x += (X_valid.zahlgesnet[i])
        elif X_valid.CM[i] == 1:
            y += (X_valid.zahlgesnet[i])
        elif X_valid.CM[i] == 2:
            z += (X_valid.zahlgesnet[i])
        elif X_valid.CM[i] == 3:
            v += (X_valid.zahlgesnet[i])

getsums(SummeFF,SummeFT,SummeTF,SummeTT)            
print(SummeFF,SummeFT,SummeTF,SummeTT)

我预计该函数会根据分类器 CM 遍历所有值并返回四个不同的总和。

我得到的错误是:

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-40-788203eee12b> in <module>
     20 
     21 
---> 22 getsums(SummeFF,SummeFT,SummeTF,SummeTT)
     23 print(SummeFF,SummeFT,SummeTF,SummeTT)
     24 

<ipython-input-40-788203eee12b> in getsums(x, y, z, v)
      7 def getsums(x,y,z,v):
      8     for i in range(len(X_valid)):
----> 9         if X_valid.CM[i] == 0:
     10             x += (X_valid.zahlgesnet[i])
     11         elif X_valid.CM[i] == 1:

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\series.py in __getitem__(self, key)
   1066         key = com.apply_if_callable(key, self)
   1067         try:
-> 1068             result = self.index.get_value(self, key)
   1069 
   1070             if not is_scalar(result):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_value(self, series, key)
   4728         k = self._convert_scalar_indexer(k, kind="getitem")
   4729         try:
-> 4730             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4731         except KeyError as e1:
   4732             if len(self) > 0 and (self.holds_integer() or self.is_boolean()):

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas\_libs\index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas\_libs\hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 2

这与我的 Dataframe 的索引未遵循 1、2、3、4、5、6、7、8、9、10 有关吗?有没有办法解决它?这是由于之前对数据帧进行了大量切片。已经非常感谢了!

【问题讨论】:

  • 你能显示预期的输出吗?

标签: python pandas numpy for-loop keyerror


【解决方案1】:

其中之一是您需要的吗?

df.groupby('CM')['zahlgesnet'].transform('sum')

输出

1    2.234,42234
3              0
4    2.234,42234
6       8.234134
7         653,23
9       8.234134
df.groupby('CM')['zahlgesnet'].sum()

输出

CM
0    2.234,42234
1         653,23
2       8.234134
3              0

【讨论】:

    【解决方案2】:

    如果我理解你想要做什么,那么你可以简单地使用 groupby:

    X_valid.groupby(['CM'])['zahlgesnet'].sum()
    

    至于你的代码,试试:

    SummeFF = 0
    SummeFT = 0
    SummeTF = 0
    SummeTT = 0
    result = 0
    
    def getsums(x,y,z,v):
        for i in range(len(X_valid)):
            if X_valid.iloc[i].CM == 0:
                x += (X_valid.iloc[i].zahlgesnet)
            elif X_valid.iloc[i].CM == 1:
                y += (X_valid.iloc[i].zahlgesnet)
            elif X_valid.iloc[i].CM == 2:
                z += (X_valid.iloc[i].zahlgesnet)
            elif X_valid.iloc[i].CM == 3:
                v += (X_valid.iloc[i].zahlgesnet)
    
    getsums(SummeFF,SummeFT,SummeTF,SummeTT)            
    print(SummeFF,SummeFT,SummeTF,SummeTT)
    

    【讨论】:

    • 非常感谢。第一种方法效果很好。仍然对于您对我的代码的想法,我确实遇到了同样的错误。有没有结论为什么会有这个keyError?
    • @Changer 是的,你需要使用integer-location based indexing。我更新了答案,它现在应该可以工作了
    猜你喜欢
    • 2016-05-15
    • 2020-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2023-02-23
    相关资源
    最近更新 更多