簡體   English   中英

兩行之間的減法

[英]subtract between two rows

我有一個類似的數據集:

name   group   val1  val2  
John    A       3     2     
Cici    B       4     3     
Ian     C       2     2     
Zhang   D       2     1
Zhang   E       1     2
Ian     F       1     2
John    B       2     1
Ian     B       1     2

我做了一個 pivot 表,現在使用這段代碼看起來像這樣

df_pivot = pd.pivot_table(df, values=['val_1, val_2], index=['name', 'group']).reset_index()
df

name   group   val1  val2  
John    A       3     2     
John    B       2     1     
Ian     C       2     2     
Ian     F       1     2
Ian     B       1     2
Zhang   D       2     1
Zhang   E       1     2
Cici    B       4     3  

在 pivot 表之后,我需要計算 1) groupby name 2) 計算組之間的增量。 以約翰為例 output 應該是:

John    A-B       1     1    
Ian     C-F       1     0
        F-B       0     0
        B-C       1     0  (the delta is -1, but we only do absolute value)

如何從我的 pivot 表繼續前進

使用簡單的groupby function 無法直接將每個組合減去(ab,ac,bc)。 我建議您使用 pivot 您的數據並使用自定義 function 來計算可能差異的每種組合:

import pandas as pd
import itertools

def combo_subtraction(df, level=0):
    unique_groups = df.columns.levels[level]
    combos = itertools.combinations(unique_groups, 2)
    
    pieces = {}
    for g1, g2 in combos:
        name = "{}-{}".format(g1, g2)
        pieces[name] = df.xs(g1, level=level, axis=1) - df.xs(g2, level=level, axis=1)
    return pd.concat(pieces)

out = (df.pivot(index="name", columns="group") # convert data to wide format
       .pipe(combo_subtraction, level=1)       # apply our combination subtraction
       .dropna()                               # clean up the result
       .swaplevel()
       .sort_index())

print(out)
           val1  val2
name
Ian   A-B   0.0   0.0
      A-C  -1.0   0.0
      B-C  -1.0   0.0
John  A-B   1.0   1.0
Zhang A-B   1.0  -1.0

combo_subtraction function 簡單地迭代“A”、“B”和“C”中 2 個的所有可能組合並執行減法運算。 然后,它將這些組合的結果重新組合在一起,形成我們的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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