根据一个或多个其他列的子集更新列A的子集

2024-04-19 12:10:38 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑我已经修改了下面的部分描述,以澄清我所说的“功能”和“组”的含义,修复了一个拼写错误,并包含了我尝试过的其他代码。你知道吗

我的熊猫df有450万行和23列。下表显示了由df生成的df2中的几行。它显示了两组(eeskinhduquant)和三个特征(失败退出状态,和作业编号):

# report by group

        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     -1     4.08219e+06      6      
21   hduquant  exit_status  5       64    -1     37               58     
11   hduquant  failed       2       64    -1     0                63     
1    hduquant  job_number   2       64    -1     4.07192e+06      61     

“rank”列值-1是占位符。你知道吗

我想更新每个功能组的排名。”在这种情况下,“特征”是指“特征”列中的每个唯一值:失败退出状态作业编号。例如,更新作业编号的排名意味着仅在列“feature”等于作业编号的行上修改列“rank”中的值。事实证明,这些行中的每一行都对应于“group”列中的不同group值。你知道吗

因此,我不想一次更新列“rank”中的所有值,而是希望逐个特性地执行这些操作,即每次写入都会更新单个特性上所有组的值。你知道吗

功能“job#u number”的排名基于“##u jobs”列的值(最高的作业数是排名1)。对于功能“failed”,排名基于“top\u value”的“freq”。exits_status现在可以保持-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”在failed排名第一,job_number排名第二hdquant“为failed排名2,job_number排名1。你知道吗

我可以用以下代码更新job_number的秩值:

if feat == 'job_number':
     grouped = grouped.sort_values("#_jobs", ascending=False)
     grouped['rank'] = grouped.index + 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    -1     0                63     
1    hduquant  job_number   2       64     1     4.07192e+06      61     

但当我尝试更新两者时,两者都没有更新:

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']
        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     -1     4.08219e+06      6      
21   hduquant  exit_status  5       64    -1     37               58     
11   hduquant  failed       2       64    -1     0                63     
1    hduquant  job_number   2       64    -1     4.07192e+06      61     

我曾试图实施马特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))

附录@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%,最大值(数值)
  • count,unique,top,freq(字符串)
  • count,first,last#时间增量列(time delta)

工作:

  • 任务编号最多的作业编号,提交次数最多的作业编号
  • 最早/最晚的作业(如上所述)
    • 提交时间、开始时间和结束时间
  • 最多的工作
    • 失败了!=0
    • 退出状态!=0
  • 最多的作业(值之和)
    • 已授予\u-pe、slots、maxvmem、h\u-data、h\u-rt、exclusive、h\u-vmem和gpu
  • 最多的作业(计数/长度)
    • pe==单个
    • pe==共享
    • pe==对于每个附加的pe类别
  • 累积时间最长/最短的作业
    • 等等,等等

所有者:

  • 工作最多的老板
  • 最早/最晚的所有者
    • 提交时间、开始时间、结束时间
  • 拥有最多
    • 失败了!=0
    • 退出状态!=0
  • 拥有最多(价值总和)的所有者
    • 已授予\u-pe、插槽、maxvmem、h\u-data、h\u-rt、独占、h\u-vmem、gpu
  • 拥有最多的所有者(计数/长度)
    • pe==单个
    • pe==共享
    • pe==对于每个附加的pe类别
  • 具有最长/最短累计值的所有者
    • 等等,等等

组:

  • 格罗最多的工作
  • 拥有最多所有者的团队
  • 最早/最晚分组
    • 提交时间、开始时间和结束时间
  • 最多的组
    • 失败了!=0
    • 退出状态!=0
  • 每个组的最大值(值之和)分组
    • 已授予\u-pe、slots、maxvmem、h\u-data、h\u-rt、exclusive、h\u-vmem和gpu
  • 最多的组
    • pe==单个
    • pe==共享
    • pe==对于每个附加的pe类别
  • 具有最长/最短累积时间的组
    • 等等,等等

个别“按组”报告的组成部分:

按特征(df中的列):

一般统计:

  • 计数,平均值,标准值,最小值,25%,50%,75%,最大值(数值)
  • count,unique,top,freq(字符串)
  • count,first,last#时间增量列(time delta)

小组统计:

按职务:

  • 任务编号最多的作业编号,提交次数最多的作业编号
  • 最早/最晚的作业(如上所述)
    • 提交时间、开始时间和结束时间
  • 最多的工作
    • 失败了!=0
    • 退出状态!=0
  • 最多的工作
    • 已授予\u-pe、slots、maxvmem、h\u-data、h\u-rt、exclusive、h\u-vmem和gpu
  • 最多的工作
    • pe==单个(计数/长度)
    • pe==共享(计数/长度)
    • pe==对于pe的每个addtl类别(计数/长度)
  • 累积时间最长/最短的作业
    • 等等,等等

所有者:

  • 工作最多的老板
  • 最早/最晚的所有者
    • 提交时间、开始时间、结束时间
  • 拥有最多
    • 失败了!=0
    • 退出状态!=0
  • 拥有最多
    • 已授予\u-pe、slots、maxvmem、h\u-data、h\u-rt、exclusive、h\u-vmem和gpu
  • 拥有最多
    • pe==单个(计数/长度)
    • pe==共享(计数/长度)
    • pe==对于pe的每个addtl类别(计数/长度)
  • 具有最长/最短累计值的所有者
    • 等等,等等

按排名:

在这里,我希望每个组与所有其他组进行排名,从使用率最高或最“失败”的1到使用率最低的203。我将使用这些值为每个组绘制一个图。你知道吗

排名:

  • 数量
    • 作业,作业编号,任务编号,提交时间
  • 第一次
    • 提交时间、开始时间、结束时间
  • 最后一次
    • 提交时间、开始时间、结束时间
  • 数量
    • 失败了!=0
    • 退出状态!=0
  • 数量
    • 已授予\u-pe、slots、maxvmem、h\u-data、h\u-rt、exclusive、h\u-vmem和gpu
  • 数量
    • pe==单个
    • pe==共享
    • pe==对于每个附加的pe类别
  • 所有作业的累计总数
    • 等等,等等

Tags: numberdftimestatus作业时间exitjob
1条回答
网友
1楼 · 发布于 2024-04-19 12:10:38

通过使用pandas.loc可以更轻松地实现这一点

初始化数据帧:

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]
})

我们想对jobs特性进行排序,所以我们只需使用.loc隔离列位置,然后在赋值的右侧,使用.loc隔离jobs列并使用.rank()函数

按职务价值排列职务特征:

df.loc[df.feature == 'job', 'rank'] = df.loc[df.feature == 'job', 'jobs'].rank(ascending=False)

按频率对故障特征进行排序,其中最大值不为0:

对于这一个你做排名的那些是0,这似乎违背了你所说的。所以我们要用两种方法。你知道吗

这样我们就可以过滤掉0,然后对其他的东西进行排序。这将使top_value == 0列保持为-1

df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'rank'] = (
        df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'freq']).rank(ascending=True)

这样我们就不会过滤掉0

df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'rank'] = (
        df.loc[(df.feature == 'fail') & (df.topvalue != 0), 'freq']).rank(ascending=True)

相关问题 更多 >