2017-03-08 68 views
2

我有一些信息数据在下面提供,如何修改熊猫数据框,插入新列

df.info() is below, 

<class 'pandas.core.frame.DataFrame'> 
Int64Index: 6662 entries, 0 to 6661 
Data columns (total 2 columns): 
value  6662 non-null float64 
country 6478 non-null object 
dtypes: float64(1), object(1) 
memory usage: 156.1+ KB 
None 


list of the columns, 
[u'value' 'country'] 


the df is below, 

     value country 
0  550.00  USA 
1  118.65 CHINA 
2  120.82 CHINA 
3  86.82 CHINA 
4  112.14 CHINA 
5  113.59 CHINA 
6  114.31 CHINA 
7  111.42 CHINA 
8  117.21 CHINA 
9  111.42 CHINA 

-------------------- 
-------------------- 
6655 500.00  USA 
6656 500.00  USA 
6657 390.00  USA 
6658 450.00  USA 
6659 420.00  USA 
6660 420.00  USA 
6661 450.00  USA 

我需要即添加另一列outlier,并把1 如果数据是针对各自的异常值国家, 否则,我需要把0.我强调,outlier将需要计算各自的国家,而不是为所有国家。

我找一些公式计算可能是在帮助离群值,例如,

# keep only the ones that are within +3 to -3 standard 
def exclude_the_outliers(df): 
    df = df[np.abs(df.col - df.col.mean())<=(3*df.col.std())] 
    return df 


def exclude_the_outliers_extra(df): 

    LOWER_LIMIT = .35 
    HIGHER_LIMIT = .70 

    filt_df = df.loc[:, df.columns == 'value'] 

    # Then, computing percentiles. 
    quant_df = filt_df.quantile([LOWER_LIMIT, HIGHER_LIMIT]) 

    # Next filtering values based on computed percentiles. To do that I use 
    # an apply by columns and that's it ! 
    filt_df = filt_df.apply(lambda x: x[(x>quant_df.loc[LOWER_LIMIT,x.name]) & 
             (x < quant_df.loc[HIGHER_LIMIT,x.name])], axis=0) 

    filt_df = pd.concat([df.loc[:, df.columns != 'value'], filt_df], axis=1) 
    filt_df.dropna(inplace=True) 
    return df 

我无法正确地使用这些公式用于此目的,但是,作为建议提供。 最后,我需要计算数据中显示的美国和中国的 异常值的百分比。

如何实现这一目标?

注:把outlier列全零容易在 pasdas,应该是这样的,

df['outlier'] = 0 

但是,它仍然找到outlier1用于覆盖 零问题那个国家。

回答

1

您可以按每个国家划分数据框,计算切片的分位数,并将outlier的值设置为该国家的索引。

可能有一种方法可以在不迭代的情况下做到,但它超出了我的想象。

# using True/False for the outlier, it is the same as 1/0 
df['outlier'] = False 

# set the quantile limits 
low_q = 0.35 
high_q = 0.7 

# iterate over each country 
for c in df.country.unique(): 
    # subset the dataframe where the country = c, get the quantiles 
    q = df.value[df.country==c].quantile([low_q, high_q]) 
    # at the row index where the country column equals `c` and the column is `outlier` 
    # set the value to be true or false based on if the `value` column is within 
    # the quantiles 
    df.loc[df.index[df.country==c], 'outlier'] = (df.value[df.country==c] 
     .apply(lambda x: x<q[low_q] or x>q[high_q])) 

编辑:为了让每个国家离群值的百分比,就可以GROUPBY全国柱上,用平均聚集。

gb = df[['country','outlier']].groupby('country').mean() 
for row in gb.itertuples(): 
    print('Percentage of outliers for {: <12}: {:.1f}%'.format(row[0], 100*row[1])) 

# output: 
# Percentage of outliers for China  : 54.0% 
# Percentage of outliers for USA   : 56.0% 
+0

非常感谢您的回答。如何找到每个国家“异常值的百分比”?我将需要作为控制台打印输出。 – Arefe

+0

为您的后续问题增加了一些代码。请记住将问题标记为已回答。 :) – James

+0

完成并感谢所有的一切。 – Arefe