关于 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
。
我的问题如下,我正在从最终看起来像 [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
。