2016-03-07 82 views
1

我需要winsorize我的12列数据框中的两列。假设我有列'A','B','C'和'D',每列都有一系列值。鉴于我已经清理了一些NaN色谱柱,色谱柱的数量从100个减少到了80个,但它们仍然被索引到100个(包括缺失的第5行)。如何在不丢失索引的情况下转换熊猫数据框?

我想通过winsorize方法只转换列'A'和'B'。为此,我必须将我的列转换为np.array。

import scipy.stats 
df['A','B','C','D'] = #some values per each column 
ab_df = df['A','B'] 
X = scipy.stats.mstats.winsorize(ab_df.values, limits=0.01) 
new_ab_df = pd.DataFrame(X, columns = ['A','B']) 
df = pd.concat([df['C','D'], new_ab_df], axis=1, join='inner', join_axes=[df.index]) 

当我转换为np.array,然后回pd.DataFrame,它的LEN()是正确的,在80,但我的指标已被重置为0-> 80。如何确保我的变换“A”和“B”列正确编制索引?我不认为我可以使用apply(),它将保留索引顺序,只需将值替换为我的方法,即只创建2列的df转换副本,然后将它们连接到我的其余部分未转换的列。

+0

列数从100减少到80,或*行数*? – Alexander

回答

2

您可以在原来的数据框上执行此操作。

从您的问题描述中,您听起来像是在混淆行和列(即您首先说您的数据框有12列,然后说列数从100减少到80)。

总是最好在你的问题中提供一个最小的数据例子。如果没有,可以在这里是一些数据基于我的假设:

import numpy as np 
import scipy.stats 
import pandas as pd 

np.random.seed(0) 
df = pd.DataFrame(np.random.randn(7, 5), columns=list('ABCDE')) 
df.iat[1, 0] = np.nan 
df.iat[3, 1] = np.nan 
df.iat[5, 2] = np.nan 

>>> df 
      A   B   C   D   E 
0 1.764052 0.400157 0.978738 2.240893 1.867558 
1  NaN 0.950088 -0.151357 -0.103219 0.410599 
2 0.144044 1.454274 0.761038 0.121675 0.443863 
3 0.333674  NaN -0.205158 0.313068 -0.854096 
4 -2.552990 0.653619 0.864436 -0.742165 2.269755 
5 -1.454366 0.045759  NaN 1.532779 1.469359 
6 0.154947 0.378163 -0.887786 -1.980796 -0.347912 

我的假设是为NaN将降大任行,然后winsorize。

mask = df.notnull().all(axis=1), ['A', 'B'] 
df.loc[mask] = scipy.stats.mstats.winsorize(df.loc[mask].values, limits=0.4) 

我对winsorize函数应用了一个上限,这样结果在这个小数据集上就更加明显了。

>>> df 
      A   B   C   D   E 
0 0.400157 0.400157 0.978738 2.240893 1.867558 
1  NaN 0.950088 -0.151357 -0.103219 0.410599 
2 0.378163 0.400157 0.761038 0.121675 0.443863 
3 0.333674  NaN -0.205158 0.313068 -0.854096 
4 0.378163 0.400157 0.864436 -0.742165 2.269755 
5 -1.454366 0.045759  NaN 1.532779 1.469359 
6 0.378163 0.378163 -0.887786 -1.980796 -0.347912 
1

只需将新值分配给现有的列。

X = scipy.stats.mstats.winsorize(ab_df.values, limits=0.01) 
df.loc[:, ['A', 'B']] = X 
相关问题