Python 对分组数据执行操作
我有一个包含以下信息的数据框:Python 对分组数据执行操作,python,pandas,Python,Pandas,我有一个包含以下信息的数据框: year state candidate percvotes electoral_votes perc_evotes vote_frac vote_int 1976 ALABAMA CARTER, JIMMY 55.727269 9 5.015454 0.015454 5 1976 ALABAMA FORD, GERALD 42.61487
year state candidate percvotes electoral_votes perc_evotes vote_frac vote_int
1976 ALABAMA CARTER, JIMMY 55.727269 9 5.015454 0.015454 5
1976 ALABAMA FORD, GERALD 42.614871 9 3.835338 0.835338 3
1976 ALABAMA MADDOX, LESTER 0.777613 9 0.069985 0.069985 0
1976 ALABAMA BUBAR, BENJAMIN 0.563808 9 0.050743 0.050743 0
1976 ALABAMA HALL, GUS 0.165194 9 0.014867 0.014867 0
其中,pervoces
是候选人获得的选票总数的百分比(之前计算),选举人票
是该州的选举人团票,percuevotes
是选举人票的计算百分比,和vote_frac
和vote_int
分别是赢得的选举人票的分数和整数部分。该数据在选举的每一年重复,然后按州每年重复。每个候选州都有一行数据,数据相似
我想做的是把剩下的选举人票分配给分数最高的候选人。这一数字因各州和年份而异。在这种情况下,将有1张剩余的选举人票(9张总票数和5+3=8票已分配),剩余的一张将分配给“福特,杰拉尔德”,因为他在vote\u frac
栏中有0.85338票。有时还有2到3个未分配的
我有一个将数据添加到字典的解决方案,但它使用for
循环。我知道一定有更好的方法以更“熊猫”的方式做到这一点。在这个循环中,我提到了groupby,但我觉得我没有充分利用熊猫的潜力
我的for
循环:
results = {}
grouped = electdf.groupby(["year", "state"])
for key, group in grouped:
year, state = key
group['vote_remaining'] = group['electoral_votes'] - group['vote_int'].sum()
remaining = group['vote_remaining'].iloc[0]
top_fracs = group['vote_frac'].nlargest(remaining)
group['total'] = (group['vote_frac'].isin(top_fracs)).astype(int) + group['vote_int']
if year not in results:
results[year] = {}
for candidate, evotes in zip(group['candidate'], group['total']):
if candidate not in results[year] and evotes:
results[year][candidate] = 0
if evotes:
results[year][candidate] += evotes
提前谢谢 可能是一个应用函数,用于查找可用的选举人票、投出的票数,并根据可用票数和投出的票数之差有条件地更新max
'vote\u frac'
行的'vote\u int'
列:
将熊猫作为pd导入
df=pd.DataFrame({'year':{0:1976,1:1976,2:1976,3:1976,4:1976},
'州':{0:'阿拉巴马',1:'阿拉巴马',2:'阿拉巴马',
3:‘阿拉巴马’,4:‘阿拉巴马’,
'候选人':{0:'卡特,吉米',1:'福特,杰拉尔德',
2:'马多克斯,雷斯脱',3:'布巴,本杰明',
4:'霍尔,格斯'},
"投票":{0:55.727269,1:42.614871,2:0.777613,3:0.563808,,
4: 0.165194},
“选举人票”:{0:9,1:9,2:9,3:9,4:9},
"perc_evotes":{0:5.015454,1:3.835338,2:0.069985,,
3: 0.050743, 4: 0.014867},
"投票":{0:0.015454,1:0.835338,2:0.069985,,
3: 0.050743, 4: 0.014867},
‘投票_int’:{0:5,1:3,2:0,3:0,4:0})
def应用额外投票(grp):
#获得第一张选举人票
#(假设组中的第一行包含
#团体的正确选举人票数)
可用投票数=grp[“选举人投票”]。iloc[0]
#获取vote_int列的总和
当前投票数=grp['vote\u int'].sum()
#如果可用票数多于所投票数
如果可用,投票>当前投票:
#在“投票分数”的最大值处更新“投票分数”列
grp.loc[
grp['vote_frac'].idxmax(),
“投票表决”
]+=可用票数-当前票数(剩余票数)
返回玻璃钢
#Groupby和Apply函数
新建df=df.groupby(['year','state'])。应用(应用额外投票)
#展示
打印(新的索引到字符串(索引=False))
输出:
年
状态
候选人
珀西投票
选举人票
perc_唤起
投票表决
投票表决
1976
阿拉巴马州
卡特,吉米
55.727269
9
5.015454
0.015454
5.
1976
阿拉巴马州
福特,杰拉尔德
42.614871
9
3.835338
0.835338
4.
1976
阿拉巴马州
马多克斯,雷斯脱
0.777613
9
0.069985
0.069985
0
1976
阿拉巴马州
本杰明·布巴
0.563808
9
0.050743
0.050743
0
1976
阿拉巴马州
霍尔,格斯
0.165194
9
0.014867
0.014867
0