我有一個熊貓資料框,如果它們具有相同的組,我需要減去行。
輸入資料框:
| 一個 | 乙 | 價值 |
|---|---|---|
| A1 | B1 | 10.0 |
| A1 | B1 | 5.0 |
| A1 | B2 | 5.0 |
| A2 | B1 | 3.0 |
| A2 | B1 | 5.0 |
| A2 | B2 | 1.0 |
預期資料幀:
| 一個 | 乙 | 價值 |
|---|---|---|
| A1 | B1 | 5.0 |
| A1 | B2 | 5.0 |
| A2 | B1 | -2.0 |
| A2 | B2 | 1.0 |
邏輯:例如,資料幀的第一行和第二行在 A1 和 B1 組中,因此值必須為 10.0 - 5.0 = 5.0。4o 和 5o 行也具有相同的組,因此值必須為 3.0 - 5.0 = -2.0。
僅減去具有相同 A 和 B 值的行。
謝謝!
uj5u.com熱心網友回復:
您可以準備要減去的重復行,然后在分組后求和。這也適用于以正確順序排列的多個重復行。
import pandas as pd
df = pd.read_html('https://stackoverflow.com/q/70438208/14277722')[0]
df.loc[df.duplicated(subset=['A','B']), 'Value'] *=-1
df.groupby(['A','B'], as_index=False).sum()
輸出
A B Value
0 A1 B1 5.0
1 A1 B2 5.0
2 A2 B1 -2.0
3 A2 B2 1.0
uj5u.com熱心網友回復:
嘗試:
subtract = lambda x: x.iloc[0] - (x.iloc[1] if len(x) == 2 else 0)
out = df.groupby(['A', 'B'])['Value'].apply(subtract).reset_index()
print(out)
# Output:
A B Value
0 A1 B1 5.0
1 A1 B2 5.0
2 A2 B1 -2.0
3 A2 B2 1.0
uj5u.com熱心網友回復:
讓我們通過里面的條件 groupby apply
out = df.groupby(['A','B'])['Value'].apply(lambda x : x.iloc[0]-x.iloc[-1] if len(x)>1 else x.iloc[0]).reset_index(name = 'Value')
Out[18]:
A B Value
0 A1 B1 5.0
1 A1 B2 5.0
2 A2 B1 -2.0
3 A2 B2 1.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/389506.html
