在不包括当前行的两列之间创建一个 pandas groupby 划分的新列
create a new column with pandas groupby division between two columns excluding the current row
我想创建一个新列,其中 pandas groupby 除当前行之外的两列。
示例数据集:
import pandas as pd
df = pd.DataFrame({'Group':['A', 'A', 'A', 'B', 'B'],
'Col_1':[100, 200, 300, 400, 500],
'Col_2':[55, 66, 77, 88, 99]})
Group
Col_1
Col_2
A
100
55
A
200
66
A
300
77
B
400
88
B
500
99
我想创建一个名为“Div_excl”的新栏目
方法:对每个Group取Col_1和Col_2的和,然后在每个groupby sum中排除当前行值,然后做除法
| Group |Col_1 | Col_2 | Div_exclud |
|-------|------|--------|---------------------------------------|
| A | 100 | 55 |[(55+66+77)-55)] / [(100+200+300)-100)]|
| A | 200 | 66 |[(55+66+77)-66)] / [(100+200+300)-200)]|
| A | 300 | 77 |[(55+66+77)-77)] / [(100+200+300)-300)]|
| B | 400 | 88 | [(88+99)-88)] / [(400+500)-400)] |
| B | 500 | 99 | [(88+99)-99)] / [(400+500)-500)] |
我试过以下方法,但看起来不对:
df.groupby('Group').apply(lambda x: (df['Col_2'].sum()-x)/(df['Col_1'].sum()-x))
试试 transform
g = df.groupby('Group')
df['New'] = (g['Col_2'].transform('sum')-df.Col_2)/(g['Col_1'].transform('sum')-df.Col_1)
df
Out[339]:
Group Col_1 Col_2 New
0 A 100 55 0.286000
1 A 200 66 0.330000
2 A 300 77 0.403333
3 B 400 88 0.198000
4 B 500 99 0.220000
这是您已经在使用的 apply
的另一种选择:
df = (
df.groupby('Group')
.apply(
lambda x: x.assign(
Div_exclud=(x['Col_2'].sum()-x['Col_2'])/(x['Col_1'].sum()-x['Col_1']))
)
.reset_index(drop=True)
)
输出:
Group Col_1 Col_2 Div_exclud
0 A 100 55 0.286000
1 A 200 66 0.330000
2 A 300 77 0.403333
3 B 400 88 0.198000
4 B 500 99 0.220000
我想创建一个新列,其中 pandas groupby 除当前行之外的两列。 示例数据集:
import pandas as pd
df = pd.DataFrame({'Group':['A', 'A', 'A', 'B', 'B'],
'Col_1':[100, 200, 300, 400, 500],
'Col_2':[55, 66, 77, 88, 99]})
Group | Col_1 | Col_2 |
---|---|---|
A | 100 | 55 |
A | 200 | 66 |
A | 300 | 77 |
B | 400 | 88 |
B | 500 | 99 |
我想创建一个名为“Div_excl”的新栏目
方法:对每个Group取Col_1和Col_2的和,然后在每个groupby sum中排除当前行值,然后做除法
| Group |Col_1 | Col_2 | Div_exclud |
|-------|------|--------|---------------------------------------|
| A | 100 | 55 |[(55+66+77)-55)] / [(100+200+300)-100)]|
| A | 200 | 66 |[(55+66+77)-66)] / [(100+200+300)-200)]|
| A | 300 | 77 |[(55+66+77)-77)] / [(100+200+300)-300)]|
| B | 400 | 88 | [(88+99)-88)] / [(400+500)-400)] |
| B | 500 | 99 | [(88+99)-99)] / [(400+500)-500)] |
我试过以下方法,但看起来不对:
df.groupby('Group').apply(lambda x: (df['Col_2'].sum()-x)/(df['Col_1'].sum()-x))
试试 transform
g = df.groupby('Group')
df['New'] = (g['Col_2'].transform('sum')-df.Col_2)/(g['Col_1'].transform('sum')-df.Col_1)
df
Out[339]:
Group Col_1 Col_2 New
0 A 100 55 0.286000
1 A 200 66 0.330000
2 A 300 77 0.403333
3 B 400 88 0.198000
4 B 500 99 0.220000
这是您已经在使用的 apply
的另一种选择:
df = (
df.groupby('Group')
.apply(
lambda x: x.assign(
Div_exclud=(x['Col_2'].sum()-x['Col_2'])/(x['Col_1'].sum()-x['Col_1']))
)
.reset_index(drop=True)
)
输出:
Group Col_1 Col_2 Div_exclud
0 A 100 55 0.286000
1 A 200 66 0.330000
2 A 300 77 0.403333
3 B 400 88 0.198000
4 B 500 99 0.220000