当列在特定范围内时,规范化 pandas 数据框中的列
Normalize columns in pandas data frame while once column is in a specific range
我在 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 轴值。
对于规范化,我使用了 Michael Aquilina post 中的 Normalise 中的想法。
因此我需要找到我的数据的最大值和最小值。我是这样做的
minBE = self.data[EXP_DATA].min()
maxBE = self.data[EXP_DATA].max()
现在我想找到此列的最大值和最小值,但仅针对 "column" EXP_DATA 中的范围,当 "column" BE 在某个范围内时。所以本质上我只想在某个 X 范围内对数据进行归一化。
解决方案
感谢 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] and 调用函数,a 和 b 也是我绘图的 x 限制,它会自动缩放可见的 Y 值介于 0 和 1 之间,因为其余数据被屏蔽。如果在没有 NRANGE 参数的情况下调用函数,则传递给函数的整个数据范围将从 0 到 1 缩放。
感谢您的帮助!
您可以使用 boolean indexing。例如,select 列 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()
我在 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 轴值。 对于规范化,我使用了 Michael Aquilina post 中的 Normalise 中的想法。 因此我需要找到我的数据的最大值和最小值。我是这样做的
minBE = self.data[EXP_DATA].min()
maxBE = self.data[EXP_DATA].max()
现在我想找到此列的最大值和最小值,但仅针对 "column" EXP_DATA 中的范围,当 "column" BE 在某个范围内时。所以本质上我只想在某个 X 范围内对数据进行归一化。
解决方案
感谢 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] and 调用函数,a 和 b 也是我绘图的 x 限制,它会自动缩放可见的 Y 值介于 0 和 1 之间,因为其余数据被屏蔽。如果在没有 NRANGE 参数的情况下调用函数,则传递给函数的整个数据范围将从 0 到 1 缩放。
感谢您的帮助!
您可以使用 boolean indexing。例如,select 列 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()