Python 根据一个或多个其他列的子集更新列A的子集
编辑我已经修改了下面的部分描述,以澄清我所说的“功能”和“组”的含义,修正了一个拼写错误,并加入了我尝试过的其他代码 My pandasPython 根据一个或多个其他列的子集更新列A的子集,python,pandas,Python,Pandas,编辑我已经修改了下面的部分描述,以澄清我所说的“功能”和“组”的含义,修正了一个拼写错误,并加入了我尝试过的其他代码 My pandasdf有450万行和23列。下表显示了从df生成的df2中的几行。它显示两个组(eeskin和hduquant)和三个功能(失败、退出状态和作业编号): “秩”列值-1是占位符 我想更新每个功能组的排名。在这种情况下,“功能”是指“功能”列中的每个唯一值:失败、退出状态和作业编号。例如,更新job_number的排名意味着仅在“feature”列等于job_num
df
有450万行和23列。下表显示了从df
生成的df2
中的几行。它显示两个组(eeskin和hduquant)和三个功能(失败、退出状态和作业编号):
“秩”列值-1是占位符
我想更新每个功能组的排名。在这种情况下,“功能”是指“功能”列中的每个唯一值:失败、退出状态和作业编号。例如,更新job_number的排名意味着仅在“feature”列等于job_number的行上修改列“rank”中的值。事实证明,这些行中的每一行都对应于“group”列中的不同group值
因此,我不想一次更新列“rank”中的所有值,而是希望逐个功能进行更新,每次写入都会更新单个功能上所有组的值
功能“job_number”的排名基于“#u jobs”列的值(最高的job数量为排名1)。对于功能“失败”,排名基于“最高值”的“频率”<代码>退出\u状态现在可以保持为-1
结果应该如下所示:
group feature #_cats #_jobs rank top_value freq \
10 eeskin failed 1 6 1 100 6
21 eeskin exit_status 1 6 -1 0 6
0 eeskin job_number 1 6 2 4.08219e+06 6
21 hduquant exit_status 5 64 -1 37 58
11 hduquant failed 2 64 2 0 63
1 hduquant job_number 2 64 1 4.07192e+06 61
“eeskin”在失败
中排名第一,在作业编号
中排名第二。“hdquant”在失败
中排名2,在作业编号
中排名1
我可以使用此代码更新作业编号
的排名值:
if feat == 'job_number':
grouped = grouped.sort_values("#_jobs", ascending=False)
grouped['rank'] = grouped.index + 1
但当我尝试同时更新这两个时,两个都没有更新:
feat = ['job_number', 'failed']
for f in feat:
if f == 'job_number':
grouped = grouped.sort_values("#_jobs", ascending=False)
grouped['rank'] = grouped.index + 1
elif f == 'failed': # or f == 'exit_status'
x = len(not grouped[f] == 0)
grouped['x'] = x
grouped = grouped.sort_values("x", ascending=False)
grouped['rank'] = grouped.index + 1
del grouped['x']
我已尝试实施Matt W.的建议,但迄今为止没有成功:
df.loc[df.feature == 'job', 'rank'] = df.loc[df.feature == 'job', 'jobs'].rank(ascending=False)
df2.loc[df2['feature' == 'job_number'] & df2['rank']] = (df2.loc[df2['#_jobs']].rank(ascending=False))
我对他的代码进行了如下修改,但也没有成功:
df.loc[df.feature == 'job', 'rank'] = df.loc[df.feature == 'job', 'jobs'].rank(ascending=False)
df2.loc[df2['feature' == 'job_number'] & df2['rank']] = (df2.loc[df2['#_jobs']].rank(ascending=False))
附录@Matt W 输入:
import pandas as pd
df = pd.DataFrame([['g1', 'u1', 3902779, '2018-09-27 21:38:06', '2018-10-01 07:24:38', '2018-10-01 08:00:42', 0, 0, 'single', 1, 55696, 609865728.0, 4.0, 6.0, 0, 0, 4.0, 0, 'single', 1, 0, pd.Timedelta('3 days 09:46:32'), pd.Timedelta('00:36:04')]],
columns=['group', 'owner', 'job_number', 'submission_time', 'start_time', 'end_time', 'failed', 'exit_status', 'granted_pe', 'slots', 'task_number', 'maxvmem', 'h_data', 'h_rt', 'highp', 'exclusive', 'h_vmem', 'gpu', 'pe', 'slot', 'campus', 'wait_time', 'wtime'])
df = (df.astype(dtype={'group':'str', 'owner':'str', 'job_number':'int', 'submission_time':'datetime64[ns]', 'start_time':'datetime64[ns]', 'end_time':'datetime64[ns]', 'failed':'int', 'exit_status':'int', 'granted_pe':'str', 'slots':'int', 'task_number':'int', 'maxvmem':'float', 'h_data':'float', 'h_rt':'float', 'highp':'int', 'exclusive':'int', 'h_vmem':'float', 'gpu':'int', 'pe':'str', 'slot':'int', 'campus':'int', 'wait_time':'timedelta64[ns]', 'wtime':'timedelta64[ns]'}))
df
输出:
group owner job_number submission_time start_time end_time failed exit_status granted_pe slots task_number maxvmem h_data h_rt highp exclusive h_vmem gpu pe slot campus wait_time wtime
0 g1 u1 3902779 2018-09-27 21:38:06 2018-10-01 07:24:38 2018-10-01 08:00:42 0 0 single 1 55696 609865728.0 4.0 6.0 0 0 4.0 0 single 1 0 3 days 09:46:32 00:36:04
4080243 g50 u92 4071923 2018-10-25 02:08:14 2018-10-27 01:41:58 2018-10-27 02:08:50 0 0 shared 1 119 7.654482e+08 2.5 1.5 0 1 16.0 0 shared 1 0 1 days 23:33:44 00:26:52
4080244 g50 u92 4071922 2018-10-25 02:08:11 2018-10-27 01:46:53 2018-10-27 02:08:53 0 0 shared 1 2208 1.074463e+09 2.5 1.5 0 10 24.0 0 shared 1 0 1 days 23:38:42 00:22:00
代码生成第一行。我又加了几行,只是为了多样化
有203个团体,699个所有者。有数千个作业:“作业”定义为作业编号、任务编号和提交时间的唯一组合
我想创建一个总体报告和每个组一个报告,这两个报告都关注资源使用情况
总体报告的组成部分:
一般统计数字:
- 计数,平均值,标准值,最小值,25%,50%,75%,最大值(数值)
- 计数、唯一、顶部、频率(字符串)
- 计数、第一次、最后一次时间增量cols(时间增量)
- 任务编号最多的作业编号,提交次数最多的作业编号
- 最早/最晚的作业(如上定义)
- 提交时间、开始时间和结束时间
- 与most合作
- 失败!=0
- 退出状态!=0
- 具有most(值之和)的作业
- 已授予\u pe、插槽、maxvmem、h_数据、h_rt、独占、h_vmem和gpu
- 具有most的作业(计数/长度)
- pe==单个
- pe==共享
- pe==对于pe的每个addtl类别
- 累积时间最长/最短的作业
- 等一下
- 拥有最多工作的老板
- 拥有最早/最新信息的所有者
- 提交时间、开始时间、结束时间
- 拥有最多
- 失败!=0
- 退出状态!=0
- 拥有最多(价值总和)的所有者
- 已授予\u pe、插槽、maxvmem、h_数据、h_rt、独占、h_vmem、gpu
- 拥有most的所有者(计数/长度)
- pe==单个
- pe==共享
- pe==对于pe的每个addtl类别
- 具有最长/最短累计时间的所有者
- 等一下
- 拥有最多工作的群体
- 拥有最多所有者的团队
- 最早/最晚的组
- 提交时间、开始时间和结束时间
- 与最
- 失败!=0
- 退出状态!=0
- 每个组中有最多(值之和)的组
- 已授予\u pe、插槽、maxvmem、h_数据、h_rt、独占、h_vmem和gpu
- 与最
- pe==单个
- pe==共享
- pe==对于pe的每个addtl类别
- 累积时间最长/最短的组
- 等一下
- 计数,平均值,标准值,最小值,25%,50%,75%,最大值(数值)
- 计数、唯一、顶部、频率(字符串)
- 计数、第一次、最后一次时间增量cols(时间增量)
- 任务编号最多的作业编号,提交次数最多的作业编号
- 最早/最晚的作业(如上定义)
- 提交时间、开始时间和结束时间
- 与most合作
- 失败!=0
- 退出状态!=0
- 与most合作
- 已授予\u pe、插槽、maxvmem、h_数据、h_rt、独占、h_vmem和gpu
- 与most合作
- pe==单个(计数/长度)
- pe==共享(计数/长度)
- pe==对于pe的每个addtl类别(计数/长度)
- 累积时间最长/最短的作业
- 等一下
- 拥有最多工作的老板
- 拥有最早/最新信息的所有者
- 提交时间、开始时间、结束时间
- 拥有最多
- 失败!=0
- 退出状态!=0
- 拥有最多
- 已授予\u pe、插槽、maxvmem、h_数据、h_rt、独占、h_vmem和gpu
- 拥有最多
- pe==单个(计数/长度)
- pe==共享(计数/长度)
- pe==对于pe的每个addtl类别(计数/长度)
- 拥有最长/
group owner job_number submission_time start_time end_time failed exit_status granted_pe slots task_number maxvmem h_data h_rt highp exclusive h_vmem gpu pe slot campus wait_time wtime 0 g1 u1 3902779 2018-09-27 21:38:06 2018-10-01 07:24:38 2018-10-01 08:00:42 0 0 single 1 55696 609865728.0 4.0 6.0 0 0 4.0 0 single 1 0 3 days 09:46:32 00:36:04 4080243 g50 u92 4071923 2018-10-25 02:08:14 2018-10-27 01:41:58 2018-10-27 02:08:50 0 0 shared 1 119 7.654482e+08 2.5 1.5 0 1 16.0 0 shared 1 0 1 days 23:33:44 00:26:52 4080244 g50 u92 4071922 2018-10-25 02:08:11 2018-10-27 01:46:53 2018-10-27 02:08:53 0 0 shared 1 2208 1.074463e+09 2.5 1.5 0 10 24.0 0 shared 1 0 1 days 23:38:42 00:22:00
df = pd.DataFrame({'group':['e','e','e','h','h','h'], 'feature':['fail', 'exit', 'job', 'exit', 'fail', 'job'], 'cats':[1, 1, 1, 5, 2, 2], 'jobs':[1, 1, 1, 64, 64, 64], 'rank':[-1, -1, -1, -1, -1, -1], 'topvalue':[100, 0, 4, 37, 0, 3.9], 'freq':[1, 1, 1, 58, 63, 61] })
df.loc[df.feature == 'job', 'rank'] = df.loc[df.feature == 'job', 'jobs'].rank(ascending=False)
df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'rank'] = ( df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'freq']).rank(ascending=True)
df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'rank'] = ( df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'freq']).rank(ascending=True)