[英]Pandas: Subtract row mean from each element in row
我有一個數據框,其行由化學元素類型索引,列表示不同的樣本。 值是浮點數,表示每個樣本中行元素的存在程度。
我想計算每一行的平均值,並從該特定行中的每個值中減去它以規范化數據,並創建該數據集的新數據幀。
我嘗試使用mean(1),它給了我一個具有每個化學元素均值的Series對象,這很好,但后來我嘗試使用減法,這是行不通的。
您可以使用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
要解除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
除了@ ajcr的優秀答案之外,您可能還需要考慮重新安排數據的存儲方式。
如果您使用電子表格,那么您目前使用不同列中的不同樣本的方式就是表示它的方式,但這可能不是表示數據最有用的方式。
通常,每列代表關於單個真實世界實體的唯一信息。 這種數據的典型例子是一個人:
id name hair_colour Age
1 Bob Brown 25
實際上,您的不同樣本是不同的現實世界實體 。
因此,我建議使用兩級索引來描述每條信息。 這樣可以更方便地操作您想要的數據。
從而:
>>> 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
我們現在擁有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
當您以這種方式查看數據時,您會發現許多曾經是多列DataFrames
用例實際上是MultiIndexed Series
,並且您對數據的表示和轉換方式有更多的了解。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.