Python 同时对行和列应用Pandas函数进行置信区间计算

Python 同时对行和列应用Pandas函数进行置信区间计算,python,pandas,dataframe,outliers,iqr,Python,Pandas,Dataframe,Outliers,Iqr,我是python编程新手。 我试图确定数据集中的异常值。我已将数据集转换为熊猫数据帧,然后应用IQR原理。 之后,我想用零替换我的异常值,然后计算平均值和标准偏差,作为偏离平均值和标准偏差的异常值 数据集的代码如下所示: import pandas as pd data = [[123,100,1200,800,800,1200,900,1400],[246,15,16,45,15,45,11,55],[234,90,105,180,90,180,100,220],[236,100,90,90

我是python编程新手。 我试图确定数据集中的异常值。我已将数据集转换为熊猫数据帧,然后应用IQR原理。 之后,我想用零替换我的异常值,然后计算平均值和标准偏差,作为偏离平均值和标准偏差的异常值


数据集的代码如下所示:

import pandas as pd
data = [[123,100,1200,800,800,1200,900,1400],[246,15,16,45,15,45,11,55],[234,90,105,180,90,180,100,220],[236,100,90,9000,90,9000,70,140]]
df = pd.DataFrame(data,columns=['ID','Store1','Store2','Store3','Min','Max','Lower_Limit','Upper_limit'])
print (df)

数据集代码段:

    ID  Store1  Store2  Store3  Min   Max  Lower_Limit Upper_limit
  123     100    1200     800  800  1200          900        1400
  246      15      16      45   15    45           11        55
  234      90     105     180   90   180          100          220
  236     100      90    9000   90  9000           70          140
如果Store1、Store2、Store3的值小于下限(['Store1']<['Lower']])或大于上限(['Store1']>['Upper']),我想将它们更新为零(0)


以下是我的职责:

def calculate_Outliers(row):
    if row['Store1'] < row['Lower_limit'] or row['Store1'] > row['Upper_limit']:
        return 0
    else:
        return row['Store1']
    if row['Store2'] < row['Lower_limit'] or row['Store2'] > row['Upper_limit']:
        return 0
    else:
        return row['Store2']
    if row['Store3'] < row['Lower_limit'] or row['Store3'] > row['Upper_limit']:
        return 0
    else:
        return row['Store3']

下面是错误的结果

    ID  Store1 Store2 Store3(Store1 Store2 Store3)
ID                  
123 NaN NaN NaN NaN 1000
246 NaN NaN NaN NaN 15
234 NaN NaN NaN NaN 0
236 NaN NaN NaN NaN 0


有没有办法修改我的原始代码来实现这一点?

下面的函数应该可以完成这项工作:

def calculate_outliers(df):
    df['Store1'][(df['Store1']<df['Lower_Limit']) | (df['Store1'] > df['Upper_limit'])] = 0
    df['Store2'][(df['Store2']<df['Lower_Limit']) | (df['Store2'] > df['Upper_limit'])] = 0
    df['Store3'][(df['Store3']<df['Lower_Limit']) | (df['Store3'] > df['Upper_limit'])] = 0
def计算异常值(df):
df['Store1'][(df['Store1']df['Upper_limit'])]=0
df['Store2'][(df['Store2']df['Upper_limit'])]=0
df['Store3'][(df['Store3']df['Upper_limit'])]=0
df.loc[(df['Store1']df['Upper_limit']),['Store1']=0
并对其他商店重复此操作。

尝试以下操作:

m=df.filter(like='Store').lt(df.Lower_Limit,axis=0)|df.filter(like='Store').\
                                                     gt(df.Upper_limit,axis=0)

df.update(df.where(~m,0).filter(like='Store'))
print(df)

    ID  Store1  Store2  Store3  Min   Max  Lower_Limit  Upper_limit
0  123       0    1200       0  800  1200          900         1400
1  246      15      16      45   15    45           11           55
2  234       0     105     180   90   180          100          220
3  236     100      90       0   90  9000           70          140
编辑 如果列名没有公共字符串,则可以使用
iloc[]

m=df.iloc[:,1:4].lt(df.Lower_Limit,axis=0)|df.iloc[:,1:4].gt(df.Upper_limit,axis=0)
df.update(df.where(~m,0).iloc[:,1:4])
print(df)

    ID  Store1  Store2  Store3  Min   Max  Lower_Limit  Upper_limit
0  123       0    1200       0  800  1200          900         1400
1  246      15      16      45   15    45           11           55
2  234       0     105     180   90   180          100          220
3  236     100      90       0   90  9000           70          140
在函数中换行:

def calculate_Outliers(df):
    m1= df['Store1'].lt(df['Lower_limit'])|df['Store1'].gt(df['Upper_limit'])
    m2 = df['Store2'].lt(df['Lower_limit'])|df['Store2'].gt(df['Upper_limit'])
    m3= df['Store3'].lt(df['Lower_limit'])|df['Store3'].gt(df['Upper_limit'])
    df.loc[m1,'Store1']=0
    df.loc[m1,'Store2']=0
    df.loc[m1,'Store3']=0
    print(df)
calculate_Outliers(df)

    ID  Store1  Store2  Store3  Min   Max  Lower_limit  Upper_limit
0  123       0       0       0  800  1200          900         1400
1  246      15      16      45   15    45           11           55
2  234       0       0       0   90   180          100          220
3  236     100      90    9000   90  9000           70          140

你能解释一下为什么存储区1、存储区3的第一行不应替换为0吗?这是错误地输入的…获取以下错误:KeyError:('Lower_Limit','Occessed at index 123')KeyError:('Lower_Limit','Occessed at index 123'))TypeError:“str”对象不能解释为整数我的数据类型仅为整数int64@New_Coder如果它说的是键错误,请检查一下名称!!是下限还是下限!?我检查了列的名称是否相同。嗨,Baris,得到相同的错误:TypeError:“str”对象不能解释为整数。KeyError:('Lower_Limit','发生在索引123')我的数据类型是仅限int的RangeIndex:13个条目,0到12个数据列(总共9列):ID 13非null int64 store1 13非null int64 store2 13非null int64 store3 13非null int64 Min 13非null int64 Max 13非null int64下限13非null int64上限13非null int64Hi@anky_91,这是一个数据集示例。原始数据集有39个变量,变量的名称不像示例数据集中提到的那样常见。它们是最小字符串匹配的极端名称。你能帮我想出一个更通用的代码吗。(注:共有300万行)@New_Coder如果列名没有公共字符串,因此无法使用
filter
,如果您知道要更新的列的位置,则可以使用
df.iloc[]
。检查编辑。嗨@anky_91,它工作正常。非常感谢!!!这真的很有帮助!!我是OOPS新手,因此我尝试了一种方法,可以使代码产品化,因为它将在生产中使用。您能让我知道并帮助我使用我尝试过的原始函数IF/ELSE编写函数吗?@New_Coder check EDITThank you@anky_91在我的函数中,它没有同时访问列和行?
m=df.filter(like='Store').lt(df.Lower_Limit,axis=0)|df.filter(like='Store').\
                                                     gt(df.Upper_limit,axis=0)

df.update(df.where(~m,0).filter(like='Store'))
print(df)

    ID  Store1  Store2  Store3  Min   Max  Lower_Limit  Upper_limit
0  123       0    1200       0  800  1200          900         1400
1  246      15      16      45   15    45           11           55
2  234       0     105     180   90   180          100          220
3  236     100      90       0   90  9000           70          140
m=df.iloc[:,1:4].lt(df.Lower_Limit,axis=0)|df.iloc[:,1:4].gt(df.Upper_limit,axis=0)
df.update(df.where(~m,0).iloc[:,1:4])
print(df)

    ID  Store1  Store2  Store3  Min   Max  Lower_Limit  Upper_limit
0  123       0    1200       0  800  1200          900         1400
1  246      15      16      45   15    45           11           55
2  234       0     105     180   90   180          100          220
3  236     100      90       0   90  9000           70          140
def calculate_Outliers(df):
    m1= df['Store1'].lt(df['Lower_limit'])|df['Store1'].gt(df['Upper_limit'])
    m2 = df['Store2'].lt(df['Lower_limit'])|df['Store2'].gt(df['Upper_limit'])
    m3= df['Store3'].lt(df['Lower_limit'])|df['Store3'].gt(df['Upper_limit'])
    df.loc[m1,'Store1']=0
    df.loc[m1,'Store2']=0
    df.loc[m1,'Store3']=0
    print(df)
calculate_Outliers(df)

    ID  Store1  Store2  Store3  Min   Max  Lower_limit  Upper_limit
0  123       0       0       0  800  1200          900         1400
1  246      15      16      45   15    45           11           55
2  234       0       0       0   90   180          100          220
3  236     100      90    9000   90  9000           70          140