[英]Groupby two columns and create a new column based on a conditional subtraction in python
我正在嘗試基於 python 中的條件減法創建一個新列。 我想首先按 A 列和 D 列對數據幀進行分組,然后取 C 的行值,其中 B 等於 2,然后從 C 列中的所有值中減去該值。
import pandas as pd
data = [
["R", 1, 2, "p"],
["R", 2, 4, "p"],
["R", 3, 6, "p"],
["R", 4, 8, "p"],
["R", 1, 6, "o"],
["R", 2, 3, "o"],
["R", 3, 1, "o"],
["R", 4, 2, "o"],
["S", 0, 5, "n"],
["S", 1, 4, "n"],
["S", 2, 1, "n"],
["S", 3, 3, "n"],
["S", 0, 3, "g"],
["S", 1, 2, "g"],
["S", 2, 9, "g"],
["S", 3, 7, "g"]]
df = pd.DataFrame(data=data, columns=["a", "b", "c", "d"])
df
Out[1]:
a b c d
0 R 1 2 p
1 R 2 4 p
2 R 3 6 p
3 R 4 8 p
4 R 1 6 o
5 R 2 3 o
6 R 3 1 o
7 R 4 2 o
8 S 0 5 n
9 S 1 4 n
10 S 2 1 n
11 S 3 3 n
12 S 0 3 g
13 S 1 2 g
14 S 2 9 g
15 S 3 7 g
希望它產生列'e':
Out[2]:
a b c d e
0 R 1 2 p -2
1 R 2 4 p 0
2 R 3 6 p 2
3 R 4 8 p 4
4 R 1 6 o 3
5 R 2 3 o 0
6 R 3 1 o -2
7 R 4 2 o -1
8 S 0 5 n 4
9 S 1 4 n 3
10 S 2 1 n 0
11 S 3 3 n 2
12 S 0 3 g -6
13 S 1 2 g -7
14 S 2 9 g 0
15 S 3 7 g -2
我將不勝感激有關如何使用轉換或映射函數來解決問題的任何提示。
IIUC,您可以在使用groupby.transform('first')
之前使用掩碼:
df['e'] = df['c'] - (df['c'].where(df['b'].eq(2))
.groupby([df['a'], df['d']])
.transform('first')
.convert_dtypes()
)
輸出:
a b c d e
0 R 1 2 p -2
1 R 2 4 p 0
2 R 3 6 p 2
3 R 4 8 p 4
4 R 1 6 o 3
5 R 2 3 o 0
6 R 3 1 o -2
7 R 4 2 o -1
8 S 0 5 n 4
9 S 1 4 n 3
10 S 2 1 n 0
11 S 3 3 n 2
12 S 0 3 g -6
13 S 1 2 g -7
14 S 2 9 g 0
15 S 3 7 g -2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.