问题描述
对于当前项目,我计划对由两个列/对象df['Policies']
和df['ProCon']
组成的Pandas DataFrame进行Winsorize。这意味着应该删除集合中高端和低端的离群值。
根据0.05
部分中显示的值,应在0.95
和df['ProCon']
进行抽奖,而如果发现异常值,则应将这两列都删掉。>
但是下面的代码不接受对def winsorize_series(df['ProCon']):
行中'ProCon'列的直接引用,从而产生有关无效语法的错误。
是否有任何明智的方法来表明ProCon
将成为温升的决定性价值?
import pandas as pd
from scipy.stats import mstats
# Loading the file
df = pd.read_csv("3d201602.csv")
# Winsorizing
def winsorize_series(df['ProCon']):
return mstats.winsorize(df['ProCon'],limits=[0.05,0.95])
# Defining the winsorized DataFrame
df = df.transform(winsorize_series)
解决方法
您是否尝试过从表中分离列名?
def winsorize_series(df,column):
return mstats.winsorize(df[column],limits=[0.05,0.95])
如果没有样本数据,则无法测试。
,根据注释,.transform
不是仅修改df中的一列或选定列的正确选择。无论传递了什么函数定义和参数,transform都将迭代并将每个列传递给func,并尝试将合并的结果广播为df的原始形状。
您需要的更加简单
limits = [0.05,0.95] # keep limits static for any calls you make
colname = 'ProCon' # you could even have a list of columns and loop... for colname in cols
df[colname] = mstats.winsorize(df[colname],limits=limits)
可以将
df.transform(func)
传递给*args
和**kwargs
,将其传递给func
,如
df = df.transform(mstats.winsorize,axis=0,a=df['ProCon'],0.95])
因此不需要
def winsorize_series...