我的问题是,我正在从一个字典中创建一个panda数据帧,最终看起来像[70k300]。我正在尝试对每个单元格进行规范化,无论是按列还是按行后,再行后列。
我以前也问过类似的问题,但这是一个[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]的情况下所需要的。当我用[70k300]尝试同样的原理时,出现了一个问题,如果我这样做的话:
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,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]
元素、[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
相减将导致第三列为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)
之间使用默认减法时,nan
将有69700列。