这是我在这里问的第一个问题,所以我希望我会足够清楚:)
所以我正在尝试编写一个离群函数,该函数需要3个参数:
-df:一个熊猫数据框
-L:包含此数据框某些列的列表
-threshold:我们可以选择一个阈值,因为我知道此函数正在使用z_score方法。
这是我要实现的功能:
def out1(df,L,threshold):
liste=[]
for i in L:
dico={}
try:
dico['Column Name']=i
dico['Number of
outliers']=len(np.where(np.abs(stats.zscore(df[L[i]])>threshold))[0])
dico['Top 10 outliers']='a' #I'll fill this later
dico['Exception']=None
except Exception as e:
dico['Exception']=str(e)
liste.append(dico)
return(liste)
在这里我必须使用一个例外,因为不是df的所有列都不一定是数字的(因此L可以包含非数字的列名),因此使用z_score方法并在其中查找异常值是没有意义的。这些列。
但是,我尝试使用以下代码运行此代码:
-df:我有一个简单的数据框
-L = ['Terminations'](我的数据框df的数字列)
-threshold = 2
这是Python2.7返回的内容:
Out[8]:
[{'Column Name': 'Terminations',
'Exception': 'list indices must be integers, not str'}]
尽管我什至不确定这是否与Try ...有关, 我真的可以使用任何帮助来解决我的问题!
先谢谢您
亚历克斯
编辑:我还没有真正弄清楚我期望什么作为输出。
假设参数L仅包含1个元素:
所以L = ['df的一列名称']
此列要么是数字列(因此我想应用z_score方法),要么不是(因此我想引发异常)。
如果此列为数字,则输出为:
[{'Column Name': 'One column name of df'; 'Number of outliers': xxx; 'Top 10 outliers': [I'll make it a liste later]; 'Exception': None}]
如果该列不是数字,则为:
[{'Column Name': 'One column name of df'; 'Number of outliers': None; 'Top 10 outliers: None, 'Exception': 'The column you chose is not numerical}]
答案 0 :(得分:1)
for i in L:
将在i
中生成列名(字符串)(而不是索引!)。后来您有了L[i]
,这是多余的和错误的,并且“列表索引必须是整数,而不是str”的原因。
作为一个可以学习的时刻,现在是建议更好的变量命名的好时机-如果您写了for column_name in column_names:
,那么写column_names[column_name]
可能就不会发生了。 :)