簡體   English   中英

熊貓:從行中的每個元素中減去行均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM