如何在保持 Dataframe 结构的同时计算 %
How to calculate % while keeping structure of the Dataframe
有人可以请教如何使用 pandas 在保持数据帧结构的同时添加和计算获胜百分比吗?
原始数据框:
Date Name Place
21-Mar John 1
22-Apr John 2
23-May John 1
22-Apr Alex 2
23-May Alex 2
21-Mar Jeff 1
22-Apr Jeff 8
23-May Jeff 5
22-Apr Randy 4
23-May Randy 5
23-Jun Randy 1
24-Jul Randy 1
需要数据框:
Date Name Place Winning %
21-Mar John 1 0.67
22-Apr John 2 0.67
23-May John 1 0.67
22-Apr Alex 2 0.00
23-May Alex 2 0.00
21-Mar Jeff 1 0.33
22-Apr Jeff 8 0.33
23-May Jeff 3 0.33
22-Apr Randy 3 0.50
23-May Randy 2 0.50
23-Jun Randy 1 0.50
24-Jul Randy 1 0.50
获胜百分比=(第一名总数)/(游泳运动员参加比赛的次数)
ex: John 参加了 3 次比赛并获得了 2 次第一名。因此,2/3= 0.67
我试过使用交叉表,但是无法保留数据框的原始结构。
比较 Series.eq
for ==
and count mean
with GroupBy.transform
的 return Series
的值与原始 DataFrame
:
的长度相同
df['Winning %'] = df['Positions'].eq(1).groupby(df['Name']).transform('mean')
#alternative
#df['Winning %'] = (df.assign(new= df['Positions'].eq(1))
# .groupby('Name')['new']
# .transform('mean'))
print (df)
Date Name Positions Winning %
0 21-Mar John 1 0.666667
1 22-Apr John 2 0.666667
2 23-May John 1 0.666667
3 22-Apr Alex 2 0.000000
4 23-May Alex 2 0.000000
5 21-Mar Jeff 1 0.333333
6 22-Apr Jeff 8 0.333333
7 23-May Jeff 5 0.333333
8 22-Apr Randy 4 0.500000
9 23-May Randy 5 0.500000
10 23-Jun Randy 1 0.500000
11 24-Jul Randy 1 0.500000
另一种解决方案,使用第一位的 sum() 来划分每个组的 len。
(
df.set_index('Name')
.assign(Winning_pct = df.groupby('Name').Place.apply(lambda x: x.eq(1).sum()/len(x)))
.reset_index()
)
有人可以请教如何使用 pandas 在保持数据帧结构的同时添加和计算获胜百分比吗?
原始数据框:
Date Name Place
21-Mar John 1
22-Apr John 2
23-May John 1
22-Apr Alex 2
23-May Alex 2
21-Mar Jeff 1
22-Apr Jeff 8
23-May Jeff 5
22-Apr Randy 4
23-May Randy 5
23-Jun Randy 1
24-Jul Randy 1
需要数据框:
Date Name Place Winning %
21-Mar John 1 0.67
22-Apr John 2 0.67
23-May John 1 0.67
22-Apr Alex 2 0.00
23-May Alex 2 0.00
21-Mar Jeff 1 0.33
22-Apr Jeff 8 0.33
23-May Jeff 3 0.33
22-Apr Randy 3 0.50
23-May Randy 2 0.50
23-Jun Randy 1 0.50
24-Jul Randy 1 0.50
获胜百分比=(第一名总数)/(游泳运动员参加比赛的次数)
ex: John 参加了 3 次比赛并获得了 2 次第一名。因此,2/3= 0.67
我试过使用交叉表,但是无法保留数据框的原始结构。
比较 Series.eq
for ==
and count mean
with GroupBy.transform
的 return Series
的值与原始 DataFrame
:
df['Winning %'] = df['Positions'].eq(1).groupby(df['Name']).transform('mean')
#alternative
#df['Winning %'] = (df.assign(new= df['Positions'].eq(1))
# .groupby('Name')['new']
# .transform('mean'))
print (df)
Date Name Positions Winning %
0 21-Mar John 1 0.666667
1 22-Apr John 2 0.666667
2 23-May John 1 0.666667
3 22-Apr Alex 2 0.000000
4 23-May Alex 2 0.000000
5 21-Mar Jeff 1 0.333333
6 22-Apr Jeff 8 0.333333
7 23-May Jeff 5 0.333333
8 22-Apr Randy 4 0.500000
9 23-May Randy 5 0.500000
10 23-Jun Randy 1 0.500000
11 24-Jul Randy 1 0.500000
另一种解决方案,使用第一位的 sum() 来划分每个组的 len。
(
df.set_index('Name')
.assign(Winning_pct = df.groupby('Name').Place.apply(lambda x: x.eq(1).sum()/len(x)))
.reset_index()
)