jer*_*iff 13 python dataframe pandas
我有一个数据框,其行由化学元素类型索引,列表示不同的样本.值是浮点数,表示每个样本中行元素的存在程度.
我想计算每一行的平均值,并从该特定行中的每个值中减去它以规范化数据,并创建该数据集的新数据帧.
我尝试使用mean(1),它给了我一个具有每个化学元素均值的Series对象,这很好,但后来我尝试使用减法,这是行不通的.
Ale*_*ley 32
你可以使用DataFrame的sub方法并指定减法应该是row-wise(axis=0)而不是默认的列式行为:
df.sub(df.mean(axis=1), axis=0)
Run Code Online (Sandbox Code Playgroud)
这是一个例子:
>>> 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
Run Code Online (Sandbox Code Playgroud)
每行的平均值很容易计算:
>>> df.mean(axis=1)
0 1
1 2
dtype: float64
Run Code Online (Sandbox Code Playgroud)
要取消平均DataFrame的行,只需减去行的平均值,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
Run Code Online (Sandbox Code Playgroud)
除了@ ajcr的优秀答案之外,您可能还需要考虑重新安排数据的存储方式.
如果您使用电子表格,那么您目前使用不同列中的不同样本的方式就是表示它的方式,但这可能不是表示数据最有用的方式.
通常,每列代表关于单个真实世界实体的唯一信息.这种数据的典型例子是一个人:
id name hair_colour Age
1 Bob Brown 25
Run Code Online (Sandbox Code Playgroud)
实际上,您的不同样本是不同的现实世界实体.
因此,我建议使用两级索引来描述每条信息.这样可以更方便地操作您想要的数据.
从而:
>>> df = pd.DataFrame([['Sn',1,2,3],['Pb',2,4,6]],
columns=['element', 'A', 'B', 'C']).set_index('element')
>>> df.columns.name = 'sample'
>>> df # This is how your DataFrame looks at the moment
sample A B C
element
Sn 1 2 3
Pb 2 4 6
>>> # Now make those columns into a second level of index
>>> df = df.stack()
>>> df
element sample
Sn A 1
B 2
C 3
Pb A 2
B 4
C 6
Run Code Online (Sandbox Code Playgroud)
我们现在拥有所有可口的功能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
Run Code Online (Sandbox Code Playgroud)
当您以这种方式查看数据时,您会发现许多曾经是多列的用例DataFrames实际上是MultiIndexed Series,并且您对数据的表示和转换方式有更多的权力.