将 Pandas 函数同时应用于行和列以进行置信区间计算
Applying Pandas Function to rows and columns simultaneously for Confidence Interval Calculations
我是 python 编程新手。
我正在尝试确定数据集中的异常值。我已将数据集转换为 pandas 数据框,然后应用 IQR 原理。
之后我想用零替换我的 OUTLIERS,然后计算平均值和标准偏差作为异常值,因为偏离平均值和 SD。
数据集代码如下:
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 的值小于 Lower_limit(['Store1'] < ['Lower_limit']) 或更大,我想将它们更新为零 (0)比 Upper_limit(['Store1'] > ['Upper_limit']).
下面是我的函数:
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']
我是这样应用的:
df['Store1','Store3','Store3'] = df.apply(calculate_Outliers, axis=1)
下面是错误的结果...
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
Desired Result:
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 0 105 180 90 180 100 220
236 100 90 0 90 9000 70 140
有什么方法可以修改我的原始代码来实现这个目标吗?
下面的函数应该可以完成工作:
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
df.loc[(df['Store1']<df['Lower_Limit']) | (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
我是 python 编程新手。 我正在尝试确定数据集中的异常值。我已将数据集转换为 pandas 数据框,然后应用 IQR 原理。 之后我想用零替换我的 OUTLIERS,然后计算平均值和标准偏差作为异常值,因为偏离平均值和 SD。
数据集代码如下:
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 的值小于 Lower_limit(['Store1'] < ['Lower_limit']) 或更大,我想将它们更新为零 (0)比 Upper_limit(['Store1'] > ['Upper_limit']).
下面是我的函数:
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']
我是这样应用的:
df['Store1','Store3','Store3'] = df.apply(calculate_Outliers, axis=1)
下面是错误的结果...
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
Desired Result:
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 0 105 180 90 180 100 220
236 100 90 0 90 9000 70 140
有什么方法可以修改我的原始代码来实现这个目标吗?
下面的函数应该可以完成工作:
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
df.loc[(df['Store1']<df['Lower_Limit']) | (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