【问题标题】:Python pandas dataframe normalize each row with only row information not column max minPython pandas数据框仅使用行信息而不是列最大最小值对每一行进行规范化
【发布时间】:2018-12-23 06:37:59
【问题描述】:

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

来源:

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 数据框,我看不到任何 Python 式的东西,而且我如何在没有复杂的 lambda 函数的情况下轻松实现它,并在每行之前存储最小最大值。 Pandas 还说我们不应该遍历行并更改值 :-( 所以我有点迷茫并感谢一些输入。

【问题讨论】:

  • @TheMaster 哦,对不起... Source 是我拥有的 pandas 数据帧的打印,Target 是我想要实现的 pandas 数据帧
  • @TheMaster 我猜你的意思是 df = (df - df.row_min()) / (df.row_max() - df.row_min()) * 1 ..... all in所有每一行最后都至少包含一个 0 ,很可能是一个 1 (如果不是所有值都是 0,则相同),所有其他值都在 0 和 1 之间

标签: python python-3.x pandas


【解决方案1】:
  1. 从每一行中减去最小的元素。
  2. 将行除以其范围(最大值与最小值之差)。
  3. 如果范围为 0,则除法产生NaNs。用原始值填充它们。

代码:

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

【讨论】:

  • 嗨@DYZ 非常感谢你,有了这些信息,我可以发布应用和替换全为负数或全为一的值。这很简单,我可以完成。
猜你喜欢
  • 2021-03-09
  • 2012-10-09
  • 2015-03-03
  • 1970-01-01
  • 2013-06-30
  • 2018-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多