2016-03-07 83 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 
相關問題