Python 熊猫通过迭代除索引外的所有列来规范化数据帧

Python 熊猫通过迭代除索引外的所有列来规范化数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我需要执行数据帧的规范化,包括一个索引列和其他带有数值的列 Index a b c xy1 555 436 3667 xz2 4626 658 463 xr3 425 674 436 bx4 4636 6567 6346 我想对数据帧执行max-min规范化,删除包含nan的列,并返回带有原始索引的规范化数据帧。 我正在考虑类似的事情,但是如何从循环中排除索引列,使其在返回的数据帧中保持不变 def no

我需要执行数据帧的规范化,包括一个索引列和其他带有数值的列

Index    a     b      c
xy1     555   436    3667
xz2    4626   658    463
xr3     425   674    436
bx4    4636   6567   6346
我想对数据帧执行max-min规范化,删除包含nan的列,并返回带有原始索引的规范化数据帧。 我正在考虑类似的事情,但是如何从循环中排除索引列,使其在返回的数据帧中保持不变

def normalize(df):
    result = df.copy()
    for feature_name in df.columns:
        max_value = df[feature_name].max()
        min_value = df[feature_name].min()
        result[feature_name] = (df[feature_name] - min_value) / (max_value - min_value)
        if result[feature_name].isnull().values.any():
            result.drop([feature_name], axis=1, inplace=True)
            print(f'Something wrong in {feature_name}, dropping this feature.')
    return result

您可以简化
min-max
缩放的实现:

s = df.set_index('Index').dropna(axis=1)
s = (s - s.min())  / (s.max() - s.min())
或者,您可以使用
sklearn.preprocessing
中的
MinMaxScaler

from sklearn.preprocessing import MinMaxScaler

s = df.set_index('Index').dropna(axis=1)
s[:] = MinMaxScaler().fit_transform(s)


df=df.set_index('index')
?我不明白。当您迭代
df.columns
时,它会返回索引吗?或者你有一个名为“索引”的列?在后一种情况下,
if feature_name==“Index”:;继续
跳过它。我搞砸了,对不起,我还不太熟悉熊猫!我假设迭代df.columns也会返回索引,但正如您所指出的,它不会。不管怎么说,你的建议很有用,因为我想跳过另一个专栏,所以我可以用它。谢谢我试过了,但我不知道如何以这种方式管理包含NaN的列,所以我在列上进行了显式循环。@Carlo不确定
管理包含NaN的列是什么意思,但我猜使用
。dropna(axis=1)
将删除包含一个或多个
NaN
值的列。抱歉,我没有解释清楚。问题是在规范化之后,有一些列包含NAN,所以在我的循环中,我正在检查并删除这些列。事实上,我现在注意到,我可以完全避免这种情况,因为似乎NAN只是由于某些列始终包含相同的值(因此s.max和s.min是相同的)。一旦我删除这些,规范化就不再产生NAN,我可以使用您的方法:)
print(s)

              a         b         c
Index                              
xy1    0.030872  0.000000  0.546701
xz2    0.997625  0.036209  0.004569
xr3    0.000000  0.038819  0.000000
bx4    1.000000  1.000000  1.000000