Python Pandas DataFrame仅使用行信息而不是column max min来规范每一行

时间:2018-12-22 22:21:02

标签: python python-3.x pandas

我的数据框目前包含以下设计

来源:

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函数的情况下实现这一点,因为每行之前都存储了min max值。 熊猫还说,我们不应该遍历行并更改值:-(因此我有点迷失了,感谢您的投入。

1 个答案:

答案 0 :(得分:2)

  1. 从每一行中减去最小的元素。
  2. 将行除以其范围(最大值和最小值之间的差)。
  3. 如果范围为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