【问题标题】:obtain corresponding values from 3rd column after groupby 2 columns在 groupby 2 列之后从第 3 列获取相应的值
【发布时间】:2021-09-30 22:33:28
【问题描述】:

以下代码对每个类别的“时间”最大值进行分组。 我想在“目标”变量中获取相应的值,但我不知道该怎么做。 有什么提示吗?

import numpy as np
import pandas as pd

data=[[1,1,2,2,'A'],
      [2,5,5,1,'A'],
      [3,7,9,4,'B'],
      [1,5,1,9,'B'],
      [1,8,2,8,'C'],
      [2,8,5,10,'C'],
      [0,1,2,3,'D']]

df=pd.DataFrame(data, columns=['time','x','y','target','categ'])
res = ((df.groupby('categ')['time'].max().value_counts(ascending=True).sort_index()))
print(res)

【问题讨论】:

    标签: python pandas group-by


    【解决方案1】:

    我们可以使用loc + groupby idxmax:

    res = df.loc[
        df.groupby('categ')['time'].idxmax(),
        ['time', 'target']
    ].sort_values('time')['target']
    

    res:

    6     3
    1     1
    5    10
    2     4
    Name: target, dtype: int64
    

    如果需要与组最大值匹配的所有行,则使用groupby transform max 过滤:

    res = df.loc[
        df.groupby('categ')['time'].transform('max').eq(df['time']),
        ['time', 'target']
    ].sort_values('time')['target']
    

    res:

    6     3
    1     1
    5    10
    2     4
    Name: target, dtype: int64
    

    *在这种情况下输出是相同的,但如果每个 categ 有重复的最大值,则不会。


    根据groupby aggtime 的cmets 并聚合到列表中:

    res = df.groupby('time')['target'].agg(list)
    

    res:

    time
    0          [3]
    1    [2, 9, 8]
    2      [1, 10]
    3          [4]
    Name: target, dtype: object
    

    【讨论】:

    • 谢谢。同样,'time' 中所有条目的代码行是这一行:time_count=(df['time'].value_counts(ascending=True).sort_index()) print(time_count)。在这种情况下如何获得目标值?
    • 时间=1,目标=2,9,8。对于时间= 2,目标= 1,10等...我想打印这些目标值组,因为之后我想将给定类别的时间最大的所有目标值的总和除以所有目标值每个时间值。如果我有点困惑但不是很容易解释,我很抱歉。我希望我已经清楚了。
    • 是的,差不多
    • 这一行 res = df.groupby('time')['target'].agg(list) 以时间升序打印,但这一行 res = df.loc[ df.groupby('categ ')['time'].transform('max').eq(df['time']),'target' 没有。你如何确保这一行也按升序打印?
    • 排序值和排序索引都不起作用。它应该按时间排序。它应该打印 3,2,1,10,4,因为 categ=3 对应于 time=0,categ 2 对应于 time=1 等等
    【解决方案2】:

    在您的情况下,在sort_values 之后执行drop_duplicates

    df.sort_values(['time']).drop_duplicates(['categ'],keep='last')['target']
    Out[184]: 
    6     3
    1     1
    5    10
    2     4
    Name: target, dtype: int64
    

    或者transform当一组categ的值都相同时,这个方法会全部输出

    df.loc[df.time.eq(df.groupby('categ').time.transform('max')),'target']
    Out[187]: 
    1     1
    2     4
    5    10
    6     3
    Name: target, dtype: int64
    

    【讨论】:

      猜你喜欢
      • 2019-09-12
      • 2018-12-25
      • 1970-01-01
      • 2022-01-08
      • 2019-04-09
      • 2020-01-30
      • 2020-11-21
      • 2023-01-20
      • 1970-01-01
      相关资源
      最近更新 更多