Python循环错误计数器

时间:2017-11-28 11:07:42

标签: python pandas machine-learning

我正在尝试删除我的DataFrame中的列,我想问为什么我不能在我的函数中迭代一个系列。这是我的代码

def checkDropVariance(df, column):
    percentage = df.groupby(column).size().sort_values(ascending=False)/len(df) * 100
    mean = percentage.mean()
    N = len(percentage)
    variance = 0
    for i in range(N):
        variance = variance + ((percentage[i]) - mean) ** 2
    variance = variance/N
    if variance > 10:
        df = dropCol(df, column)
    return df

但是在函数之外,如果我做了类似的事情:

percentage = df.groupby('grade').size().sort_values(ascending=False)/len(df) * 100
percentage
percentage[2]

我得到了

grade
B    28.822392
C    27.705086
A    16.809648
D    15.621800
E     8.012288
F     2.412106
G     0.616680
dtype: float64

16.809648424166571

KeyError返回0 我发现如果我将百分比[i]中的i更改为5,我得到KeyError返回5 这是错误代码:

KeyError                                  Traceback (most recent call last)
<ipython-input-33-2e9f3e36e2d6> in <module>()
      1 for i in df.columns.values:
----> 2     df = checkDropVariance(df, i)

<ipython-input-32-126f83f240cc> in checkDropVariance(df, column)
      5     variance = 0
      6     for i in range(N):
----> 7         variance = variance + ((percentage[i]) - mean) ** 2
      8     variance = variance/N
      9     if variance > 10:

/home/atmaja/anaconda3/lib/python3.6/site-packages/pandas/core/series.py in __getitem__(self, key)
    599         key = com._apply_if_callable(key, self)
    600         try:
--> 601             result = self.index.get_value(self, key)
    602 
    603             if not is_scalar(result):

/home/atmaja/anaconda3/lib/python3.6/site-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   2426         try:
   2427             return self._engine.get_value(s, k,
-> 2428                                           tz=getattr(series.dtype, 'tz', None))
   2429         except KeyError as e1:
   2430             if len(self) > 0 and self.inferred_type in ['integer', 'boolean']:

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value (pandas/_libs/index.c:4363)()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value (pandas/_libs/index.c:4046)()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc (pandas/_libs/index.c:5085)()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item (pandas/_libs/hashtable.c:13913)()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item (pandas/_libs/hashtable.c:13857)()

KeyError: 0

感谢您的时间

2 个答案:

答案 0 :(得分:0)

KeyError来自pandas,因为percentage[i]尝试访问列&#34; i&#34; (不是位置i的列)。如果您想访问第i列,则可以使用docs中详细说明的.iloc。也就是说,除非你的列被命名为整数,否则它应该可以工作。

即,

import numpy as np
import pandas as pd

df = pd.DataFrame(np.random.rand(3,3))
print(df)

print(df[2])

给出

          0         1         2
0  0.727617  0.920699  0.916352
1  0.985916  0.405609  0.123758
2  0.230229  0.981319  0.182571

0    0.916352
1    0.123758
2    0.182571

但是使用df = pd.DataFrame(np.random.rand(3,3),columns=['A','B','C'])运行该代码将产生KeyError。

答案 1 :(得分:0)

从堆栈跟踪中可以看到错误发生在该行上:

variance = variance + ((percentage[i]) - mean) ** 2

这是因为percentage[i]是pandas的一种说法:向我提供percentage数据框列i中的数据。但在这种情况下,i0,而名为percentage的数据框没有名为0的列。所以你得到了一个KeyError。

看来你还没有完全掌握如何使用熊猫。 Pandas has a built-in variance function.你可以创建一个函数来删除方差大于10的列,如下所示:

def checkDropVariance(df, column):
    # get the variance of column data
    v = df[column].var()
    # drop the column if the variance is higher than 10
    if v > 10:
        df = df.drop(column, axis=1)
    return df