用args定义要在df.transform中使用的函数

问题描述

对于当前项目,我计划对由两个列/对象df['Policies']df['ProCon']组成的Pandas DataFrame进行Winsorize。这意味着应该删除集合中高端和低端的离群值。

根据0.05部分中显示的值,应在0.95df['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...