gpt4 book ai didi

python - Pandas 中的条件计算

转载 作者:行者123 更新时间:2023-12-04 08:57:53 25 4
gpt4 key购买 nike

我在 SQL 中进行了一个计算,如下所示:

SELECT 
round(sum(total_size) / (1024*1024), 2) 'Total (PB)' ,
round(sum(keep_size) / (1024*1024), 2) 'Keep (PB)' ,
round(sum(remove_size) / (1024*1024), 2) 'Remove (PB)'
FROM (
SELECT
case when dedupe_status='K' then path when dedupe_status='R' then null when dedupe_status='G' then group_super end as g_key,
round(sum(file_size), 2) total_size,
case when dedupe_status='R' then round(sum(file_size), 2) when dedupe_status='K' then 0 when dedupe_status='G' then round(sum(file_size) - file_size, 2) end remove_size,
case when dedupe_status='R' then 0 when dedupe_status='K' then file_size when dedupe_status='G' then round(sum(file_size) - (sum(file_size) - file_size), 2) end keep_size
from dedupe__df group by g_key
) clean_list
我只包括这个以供引用。这是我的数据框,我试图在 Pandas 中进行相同的计算。这是我拥有的数据框:
df=pd.DataFrame([
{'dedupe_status': 'R', 'size': 134, 'dedupe_key': 'g_149'},
{'dedupe_status': 'K', 'size': 101, 'dedupe_key': 'g9'},
{'dedupe_status': 'G', 'size': 101, 'dedupe_key': 'x09'},
{'dedupe_status': 'G', 'size': 405, 'dedupe_key': 'xx01'},
{'dedupe_status': 'G', 'size': 4, 'dedupe_key': 'x09'},
{'dedupe_status': 'G', 'size': 1405, 'dedupe_key': 'xx01'},
{'dedupe_status': 'G', 'size': 401, 'dedupe_key': 'xx01'},
])
我想得到三个值的结果, Total Size , Remove Size , 和 Keep Size .以下是它们的计算方式:
  • Total : 很简单,总结一下所有的大小。
  • Keep :如果状态是 K ( 保留 ),将大小相加。如果状态为 R ( 删除 ),如果状态为 G,则跳过它( ) 然后在 dedupe_key 上组并保留 只有一个 大小(不管哪个,如果最简单,您可以获取 firstmin )。换句话说,当值为 G 时,这意味着该组中的所有元素都是重复的,我们只需要保留其中一个。
  • Remove :Total - Keep

  • 有了上述值,我们将有:
    field           value            # comments
    Total 2551 # df['size'].sum()
    Keep 607 # 101 (K) + 101 (G: x09) + 405(G: xx01)
    Remove 1944 # 134 (R) + 4 (G: x08) + 1405+401 (G: xx01)
    到目前为止,我有:
    >>> df['new_key'] = df.apply(lambda row: 'R' if row.dedupe_status == 'R' else row.dedupe_key, axis=1)
    >>> df.groupby('new_key').agg(total=('size', 'sum'))
    我将如何在 Pandas 中完成其余的工作?

    最佳答案

    让我们试试 np.where找到那些 Keep :

    mask = np.where(df.dedupe_status.eq('R') | 
    (df.duplicated(['dedupe_status', 'dedupe_key']) &
    df.dedupe_status.eq('G')
    ),
    'Remove', 'Keep')



    ret = df.groupby(mask)['size'].sum()
    ret.loc['Total'] = ret.sum()
    输出:
    Keep       607
    Remove 1944
    Total 2551
    Name: size, dtype: int64

    关于python - Pandas 中的条件计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63716326/

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