Python 熊猫:从行中的每个元素中减去行平均值

Python 熊猫:从行中的每个元素中减去行平均值,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个数据框架,其中的行按化学元素类型索引,列表示不同的样本。这些值是浮点数,表示每个样本中行元素的存在程度 我想计算每一行的平均值,然后从该特定行的每个值中减去它,以规范化数据,并为该数据集创建一个新的数据帧 我试着使用mean(1),它给了我一个系列对象,每个化学元素的平均值,这是好的,但是我试着使用subtract,它不起作用。你可以使用DataFrame的sub方法,并指定减法应该按行进行(axis=0)与默认的按列行为相反: df.sub(df.mean(axis=1), axis=

我有一个数据框架,其中的行按化学元素类型索引,列表示不同的样本。这些值是浮点数,表示每个样本中行元素的存在程度

我想计算每一行的平均值,然后从该特定行的每个值中减去它,以规范化数据,并为该数据集创建一个新的数据帧


我试着使用mean(1),它给了我一个系列对象,每个化学元素的平均值,这是好的,但是我试着使用subtract,它不起作用。

你可以使用DataFrame的
sub
方法,并指定减法应该按行进行(
axis=0
)与默认的按列行为相反:

df.sub(df.mean(axis=1), axis=0)
下面是一个例子:

>>> df = pd.DataFrame({'a': [1.5, 2.5], 'b': [0.25, 2.75], 'c': [1.25, 0.75]})
>>> df
     a     b     c
0  1.5  0.25  1.25
1  2.5  2.75  0.75
每行的平均值很容易计算:

>>> df.mean(axis=1)
0    1
1    2
dtype: float64
要取消数据帧行的平均值,只需从
df
中减去行的平均值,如下所示:

>>> df.sub(df.mean(axis=1), axis=0)
     a     b     c
0  0.5 -0.75  0.25
1  0.5  0.75 -1.25

除了@ AJCR的优秀答案之外,您可能还需要考虑重新排列存储数据的方式。 目前,在不同的列中使用不同的示例时,您所采用的方式是使用电子表格时的表示方式,但这可能不是表示数据的最有用的方式

通常情况下,每列表示一个真实实体的唯一信息。此类数据的典型示例是一个人:

id  name  hair_colour  Age
1   Bob   Brown        25
实际上,不同的示例是不同的真实世界实体

因此,我建议使用两级索引来描述每一条信息。这使得以您想要的方式操作数据更加方便

因此:

现在,我们可以使用
groupby
的所有美味功能:

>>> demean = lambda x: x - x.mean()
>>> df.groupby(level='element').transform(demean)
element  sample
Sn       A        -1
         B         0
         C         1
Pb       A        -2
         B         0
         C         2

当您以这种方式查看数据时,您会发现许多以前是多列
数据帧的用例实际上是多索引
系列
,您在数据的表示和转换方面拥有更大的权力。

我认为轴确实令人困惑。例如,
axis=1
意味着获得行平均值,然而,
axis=1
意味着减去列平均值,我是否误解了如何使用axis的传统。我同意这可能会很混乱(我经常被卡住,在处理NumPy/Pandas的时候不得不玩弄轴号)。基本上,
axis=1
只是表示“跨越数据帧”。这可能意味着一行中的条目(如
df.mean(axis=1)
),或者,由于列的名称也跨越数据帧,因此在需要引用列名时使用
axis=1
。关于堆栈溢出这个主题,我想有几个问题,其中一个我已经回答了。
>>> demean = lambda x: x - x.mean()
>>> df.groupby(level='element').transform(demean)
element  sample
Sn       A        -1
         B         0
         C         1
Pb       A        -2
         B         0
         C         2