如何在不丢失索引的情况下转换pandas中的数据帧?

时间:2016-03-07 03:47:22

标签: python pandas scipy data-cleansing data-cleaning

我需要在12列的数据框中对两列进行winsorize。

说,我有列'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的转换副本,然后将它们连接到我的其余部分非变换列。

2 个答案:

答案 0 :(得分:4)

您可以在原地数据框中执行此操作。

从您的问题描述来看,这听起来像是令人困惑的行和列(即您首先说您的数据框有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 :(得分:1)

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

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