gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:45:55 24 4
gpt4 key购买 nike

编辑我已经修改了以下描述的部分,以阐明我所说的“功能”和“组”的含义,修正错字,并包括我尝试过的其他代码。

我的 Pandas df有450万行和23列。下表显示了从df2生成的df的几行。它显示了两个组(eeskin和hduquant)和三个功能(失败,exit_status和job_number):

# 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

“等级”列的值为-1是占位符。

我想为每个功能更新每个组的排名。在这种情况下,“功能”表示“功能”列中的每个唯一值:失败,exit_status和job_number。例如,更新job_number的排名意味着仅在“功能”列等于job_number的行上修改“rank”列中的值。事实证明,这些行中的每一行还对应于“组”列中的不同组值。

因此,我不想一次更新每个列“rank”中的所有值,而是要逐个功能地对它们进行处理,其中每次写入都会更新单个功能上所有组的值。

特征“job_number”的等级基于“#_jobs” col的值(最高的作业数量是等级1)。对于功能“失败”,排名基于“top_value”的“频率”。 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排名为1,而 job_number排名为2。 “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

我已经尝试实施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))

附录 @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个所有者。有数千个作业:“作业”定义为job_number,task_number和Submitting_time的唯一组合。

我想创建一个整体报告,每个组一个报告,都集中在资源使用上。

总体报告的组成部分:

一般统计:
  • 计数,平均值,std,最小值,25%,50%,75%,最大值(数字)
  • 计数,唯一,顶部,频率(字符串)
  • count,第一个,最后一个#时间增量cols(时间增量)

  • 工作:
  • 任务编号最多的job_number,job_number提交时间最多的
  • 最早/最新的
  • 作业(如上所定义)
  • 提交时间,开始时间和结束时间
  • 工作最多
  • 失败!= 0
  • exit_status!= 0
  • 作业最多(值的总和)
  • grant_pe,slot,maxvmem,h_data,h_rt,exclusive,h_vmem和gpu
  • 工作最多(计数/ len)
  • pe ==单个
  • pe ==共享
  • pe == pe的每个addtl类别
  • 最长/最短累积的
  • 作业
  • wait_time和wtime

  • 拥有者:
  • 工作最多的所有者
  • 拥有最早/最新的所有者
  • 提交时间,开始时间,结束时间
  • 拥有者最多
  • 失败!= 0
  • exit_status!= 0
  • 拥有最多的所有者(值的总和)
  • grant_pe,插槽,maxvmem,h_data,h_rt,独占,h_vmem,gpu
  • 拥有者最多(计数/ len)
  • pe ==单个
  • pe ==共享
  • pe == pe的每个addtl类别
  • 最长/最短累积的
  • 所有者
  • wait_time和wtime

  • 团体:
  • 职位最多的
  • 拥有最多所有者的
  • 最早/最新的

  • 提交时间,开始时间和结束时间
  • 群组最多
  • 失败!= 0
  • exit_status!= 0
  • 组,每个组最多(值的总和)
  • grant_pe,slot,maxvmem,h_data,h_rt,exclusive,h_vmem和gpu
  • 群组最多
  • pe ==单个
  • pe ==共享
  • pe == pe的每个addtl类别
  • 最长/最短累积的

  • wait_time和wtime

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

    按功能(df中的列):

    一般统计:
  • 计数,平均值,std,最小值,25%,50%,75%,最大值(数字)
  • 计数,唯一,顶部,频率(字符串)
  • count,第一个,最后一个#时间增量cols(时间增量)

  • 该组的统计信息:

    按工作:
  • 任务编号最多的job_number,job_number最多submittion_times的
  • 最早/最新的
  • 作业(如上所定义)
  • 提交时间,开始时间和结束时间
  • 工作最多
  • 失败!= 0
  • exit_status!= 0
  • 工作最多
  • grant_pe,slot,maxvmem,h_data,h_rt,exclusive,h_vmem和gpu
  • 工作最多
  • pe ==单(count / len)
  • pe ==共享(计数/ len)
  • pe == pe(count / len)的每个addtl类别
  • 最长/最短累积的
  • 作业
  • wait_time和wtime

  • 由业主:
  • 工作最多的所有者
  • 拥有最早/最新的所有者
  • 提交时间,开始时间,结束时间
  • 拥有者最多
  • 失败!= 0
  • exit_status!= 0
  • 拥有者最多
  • grant_pe,slot,maxvmem,h_data,h_rt,exclusive,h_vmem和gpu
  • 拥有者最多
  • pe ==单(count / len)
  • pe ==共享(计数/ len)
  • pe == pe(count / len)的每个addtl类别
  • 最长/最短累积的
  • 所有者
  • wait_time和wtime

  • 排名:

    在这里,我希望每个组都与其他所有组相对,从使用率最高或失败最多的1个到使用率最低的203个。我将使用这些值绘制每个组的图形。

    排名:
  • 的数量
  • 职位,job_numbers,task_numbers,提交时间
  • 上学时间
  • 提交时间,开始时间,结束时间
  • 上次时间
  • 提交时间,开始时间,结束时间
  • 的数量
  • 失败!= 0
  • exit_status!= 0
  • 的数量
  • grant_pe,slot,maxvmem,h_data,h_rt,exclusive,h_vmem和gpu
  • 的数量
  • pe ==单个
  • pe ==共享
  • pe == pe的每个addtl类别
  • 所有工作总计
  • wait_time和wtime
  • 最佳答案

    您可以使用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]
    })

    我们想对作业功能进行排名,因此我们只需要使用 .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)

    关于python - pandas python根据一个或多个其他列的子集更新列A的子集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55034626/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com