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