我的数据框当前包含以下设计
来源:
index col1 col2 col3
row1 100 50 0
row2 -100 50 -25
row3 0 0 0
row4 -1 -1 -1
row5 1 1 1
row6 -100 0 1
我的目标是
index col1 col2 col3
row1 1.0 0.5 0.0
row2 0 1 0.5
row3 0 0 0
row4 0 0 0
row5 0 0 0
row6 0 0.99 1
我从 Stackoverflow 的答案中尝试了什么:
标准化列最大值而不是行最大值/最小值
df = (df.T / df.T.sum()).T
标准化列最大值而不是行最大值/最小值
df = df.div(df.sum(axis=1), axis=0)
标准化列最大值而不是行最大值/最小值
df.iloc[:,:] = Normalizer(norm='l2').fit_transform(df)
我确实尝试过改变:
df.div(df.sum(axis=1), axis=0)
并使用轴,不幸的是,一旦我更改任何轴,它就会抛出错误。
通过阅读内置函数的 pandas 数据框,我看不到任何 Pythonic 和简单的实现方式,而无需在应用上存储每行之前的最小最大值的复杂 lambda 函数。 Pandas 还说我们不应该迭代行并更改值:-( 所以我有点迷失并欣赏一些输入。
最佳答案
- 从每行中减去最小的元素。
- 将该行除以其范围(最大值和最小值之间的差值)。
- 如果范围为 0,则除法将产生
NaN
。用原始值填充它们。
代码:
df.subtract(df.min(axis=1), axis=0)\
.divide(df.max(axis=1) - df.min(axis=1), axis=0)\
.combine_first(df)
# col1 col2 col3
#row1 1.0 0.500000 0.0
#row2 0.0 1.000000 0.5
#row3 0.0 0.000000 0.0
#row4 -1.0 -1.000000 -1.0
#row5 1.0 1.000000 1.0
#row6 0.0 0.990099 1.0
关于Python pandas dataframe 仅使用行信息而不是列 max min 标准化每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53899700/