Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对分组数据执行操作_Python_Pandas - Fatal编程技术网

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