![](/img/trans.png)
[英]How to subtract rows between two different dataframes and replace original value?
[英]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.