在列处于特定范围内时,对pandas数据框中的列进行标准化

时间:2017-07-14 09:35:03

标签: python pandas normalize xrange

我在pandas中有一个数据框,其中包含我的实验数据。它看起来像这样:

KE  BE  EXP_DATA  COL_1  COL_2  COL_3 .....
10  1   5         1      2      3   
9   2   .         .      .      .
8   3   .         .
7   4
6   5
.
.   

不使用KE列。 BE是x轴的值,所有其他列是y轴值。 为了规范化,我在迈克尔阿奎利纳的帖子中使用了Normalise这里提出的想法。 因此,我需要找到我的数据的最大值和最小值。我是这样做的

    minBE = self.data[EXP_DATA].min()
    maxBE = self.data[EXP_DATA].max()

现在我想查找此列的最大值和最小值,但仅针对"列中的范围" EXP_DATA时"列" BE在一定范围内。所以本质上我只想在某个X-Range中对数据进行标准化。

解决方案

感谢Milo给我的解决方案,我现在使用这个功能:

def normalize(self, BE="Exp",NRANGE=False):
    """
    Normalize data by dividing all components by the max value of the data.

    """
    if BE not in self.data.columns:
        raise NameError("'{}' is not an existing column. ".format(BE) +
                        "Try list_columns()")
    if NRANGE and len(NRANGE)==2:
        upper_be = max(NRANGE)
        lower_be = min(NRANGE)
        minBE = self.data[BE][(self.data.index > lower_be) & (self.data.index < upper_be)].min()
        maxBE = self.data[BE][(self.data.index > lower_be) & (self.data.index < upper_be)].max()
        for col in self.data.columns:                                                           # this is done so the data in NRANGE is realy scalled between [0,1]
            msk = (self.data[col].index < max(NRANGE)) & (self.data[col].index > min(NRANGE))
            self.data[col]=self.data[col][msk]
    else:

        minBE = self.data[BE].min()
        maxBE = self.data[BE].max()

    for col in self.data.columns:
        self.data[col] = (self.data[col] - minBE) / (maxBE - minBE)

如果我使用参数NRANGE = [a,b] 调用该函数,a和b也是我的绘图的x限制,它会自动将0到1之间的可见Y值缩放为其余数据被掩盖了。如果在没有NRANGE参数的情况下调用函数,则传递给函数的整个数据范围将从0 o 1开始缩放。

感谢您的帮助!

1 个答案:

答案 0 :(得分:2)

您可以使用boolean indexing。例如,要选择EXP_DATA列中BE大于2且小于5的最大值和最小值:

lower_be = 2
upper_be = 5

max_in_range = self.data['EXP_DATA'][(self.data['BE'] > lower_be) & (self.data['BE'] < upper_be)].max()
min_in_range = self.data['EXP_DATA'][(self.data['BE'] > lower_be) & (self.data['BE'] < upper_be)].min()