我正在尝试删除我的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
感谢您的时间
答案 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
中的数据。但在这种情况下,i
为0
,而名为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