关于 pandas 轴工作我的代码的怀疑可能已关闭

Doubts about pandas axis working my code may be off

我的问题如下,我正在从最终看起来像 [70k, 300] 的字典中创建一个 pandas 数据框。我正在尝试规范化每个单元格,无论是按列还是在行之后,还是围绕行然后是列。

我之前问过一个类似的问题,但这是一个 [70k, 70k] 数据框,所以正方形而且它只是通过这样做工作

dfNegInfoClearRev = (df - df.mean(axis=1)) / df.std(axis=1).replace(0, 1)
dfNegInfoClearRev = (dfNegInfoClearRev - dfNegInfoClearRev.mean(axis=0)) / dfNegInfoClearRev.std(axis=0).replace(0, 1)
print(dfNegInfoClearRev)

这满足了 [70k, 70k] 的情况。当我用 [70k, 300] 尝试相同的原理时出现了一个问题,如果我这样做:


dfRINegInfo = (dfRI - dfRI.mean(axis=0)) / dfRI.std(axis=0).replace(0, 1)
dfRINegInfoRows = (dfRINegInfo - dfRINegInfo.mean(axis=1)) / dfRINegInfo.std(axis=1).replace(0, 1)

我不知何故得到了一个 [70k, 70k+300] 充满同名的 NaN。

我最终这样做了:

dfRIInter = dfRINegInfo.sub(dfRINegInfo.mean(axis=1), axis=0)
dfRINegInfoRows = dfRIInter.div(dfRIInter.std(axis=1), axis=0).fillna(1).replace(0, 1)

print(dfRINegInfoRows)

但我不确定这是否是我想要做的,也不太明白为什么在它确实起作用的列规范化 [70k, 300] 之后,行规范化给我一个 [70k, 70k +300],我不确定这种方式是否有效是我正在尝试做的。有帮助吗?

我认为您的新代码可以满足您的要求。

如果我们看一个 3x3 的玩具示例:

df = pd.DataFrame([
    [1, 2, 3],
    [2, 4, 6],
    [3, 6, 9],
])

axis=1 的意思是:

df.mean(axis=1)

# 0    2.0
# 1    4.0
# 2    6.0
# dtype: float64

并且减法应用于每一行(即,[1,2,3] - [2,4,6] element-wise,[2-4-6] - [2,4,6],和 [3,6,9] - [2,4,6]):

df - df.mean(axis=1)

#      0    1    2
# 0 -1.0 -2.0 -3.0
# 1  0.0  0.0  0.0
# 2  1.0  2.0  3.0

所以如果我们有 df2 形状的 3x2:

df2 = pd.DataFrame([
    [1,2],
    [3,6],
    [5,10],
])

axis=1 均值仍然是长度 3:

df2.mean(axis=1)

# 0    1.5
# 1    4.5
# 2    7.5
# dtype: float64

减法将导致第 3 列为 nan(即 [1,2,nan] - [1.5,4.5,7.5] 元素,[3,6,nan] - [1.5,4.5,7.5],和 [5,10,nan] - [1.5,4.5,7.5]):

df2 - df2.mean(axis=1)

#      0    1   2
# 0 -0.5 -2.5 NaN
# 1  1.5  1.5 NaN
# 2  3.5  5.5 NaN

如果您自己沿着 axis=0 进行减法,那么它会按预期工作:

df2.sub(df2.mean(axis=1), axis=0)

#      0    1
# 0 -0.5  0.5
# 1 -1.5  1.5
# 2 -2.5  2.5

所以当你在(70000, 300)(70000,1)之间使用默认减法时,将有69700列nan