GroupBy一列,对pandas中分组记录的另一列进行自定义操作
GroupBy one column, custom operation on another column of grouped records in pandas
我想通过对另一列的值进行分组来对一列应用自定义操作。按列分组以获得计数,然后将所有分组记录的另一列值除以该计数。
我的数据框:
emp opp amount
0 a 1 10
1 b 1 10
2 c 2 30
3 b 2 30
4 d 2 30
我的场景:
- 对于 opp=1,两个 emp 工作(a,b)。所以金额应该像这样分享
10/2 =5
- 对于 opp=2,两个 emp 工作(b、c、d)。所以数量应该是
30/3 = 10
最终输出数据帧:
emp opp amount
0 a 1 5
1 b 1 5
2 c 2 10
3 b 2 10
4 d 2 10
最好的做法是什么
df['amount'] = df.groupby('opp')['amount'].transform(lambda g: g/g.size)
df
# emp opp amount
# 0 a 1 5
# 1 b 1 5
# 2 c 2 10
# 3 b 2 10
# 4 d 2 10
或者:
df['amount'] = df.groupby('opp')['amount'].apply(lambda g: g/g.size)
做类似的事情。
您可以尝试这样的操作:
df2 = df.groupby('opp').amount.count()
df.loc[:, 'calculated'] = df.apply( lambda row: \
row.amount / df2.ix[row.opp], axis=1)
df
产量:
emp opp amount calculated
0 a 1 10 5
1 b 1 10 5
2 c 2 30 10
3 b 2 30 10
4 d 2 30 10
我想通过对另一列的值进行分组来对一列应用自定义操作。按列分组以获得计数,然后将所有分组记录的另一列值除以该计数。
我的数据框:
emp opp amount
0 a 1 10
1 b 1 10
2 c 2 30
3 b 2 30
4 d 2 30
我的场景:
- 对于 opp=1,两个 emp 工作(a,b)。所以金额应该像这样分享 10/2 =5
- 对于 opp=2,两个 emp 工作(b、c、d)。所以数量应该是 30/3 = 10
最终输出数据帧:
emp opp amount
0 a 1 5
1 b 1 5
2 c 2 10
3 b 2 10
4 d 2 10
最好的做法是什么
df['amount'] = df.groupby('opp')['amount'].transform(lambda g: g/g.size)
df
# emp opp amount
# 0 a 1 5
# 1 b 1 5
# 2 c 2 10
# 3 b 2 10
# 4 d 2 10
或者:
df['amount'] = df.groupby('opp')['amount'].apply(lambda g: g/g.size)
做类似的事情。
您可以尝试这样的操作:
df2 = df.groupby('opp').amount.count()
df.loc[:, 'calculated'] = df.apply( lambda row: \
row.amount / df2.ix[row.opp], axis=1)
df
产量:
emp opp amount calculated
0 a 1 10 5
1 b 1 10 5
2 c 2 30 10
3 b 2 30 10
4 d 2 30 10