首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对数据进行分组,同时保留所有行的最大值Python

如何对数据进行分组,同时保留所有行的最大值Python
EN

Stack Overflow用户
提问于 2020-11-09 02:48:34
回答 3查看 34关注 0票数 1

这看起来并不难,但还没有找到解决方案。我有一个df,看起来像这样:

代码语言:javascript
复制
df = {'Name': ['MIR-10','MIR-10','LET-7','LET-7','LET-7','MIR-142','MIR-142','MIR-142'],
     'Type':['3prime','3prime','3prime','5prime','5prime','3prime','5prime','3prime']}
df = pd.DataFrame(data=df)
print(df)

      Name    Type
0   MIR-10  3prime
1   MIR-10  3prime
2    LET-7  3prime
3    LET-7  5prime
4    LET-7  5prime
5  MIR-142  3prime
6  MIR-142  5prime
7  MIR-142  3prime

我使用groupby()计算了Name中每个元素的每个Type的频率,如下所示:

代码语言:javascript
复制
df['count'] = df.groupby(['Name','Type'])['Type'].transform('count')
print(df)

      Name    Type  count
0   MIR-10  3prime      2
1   MIR-10  3prime      2
2    LET-7  3prime      1
3    LET-7  5prime      2
4    LET-7  5prime      2
5  MIR-142  3prime      2
6  MIR-142  5prime      1
7  MIR-142  3prime      2

然后,如果count列是列NameType的最大值,我想要做的就是保留df。所需的输出应如下所示:

代码语言:javascript
复制
      Name    Type  count
0   MIR-10  3prime      2
1   MIR-10  3prime      2
2    LET-7  5prime      2
3    LET-7  5prime      2
4  MIR-142  3prime      2
5  MIR-142  3prime      2

我尝试了几种方法(如下所示),但无法获得目标输出。

代码语言:javascript
复制
df = df.groupby(['Name','Type'])['count'].transform(max)
print(df)

提前谢谢你。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-11-09 03:19:44

不完全确定这是否是您要查找的内容,但我确定了每个类型的最大计数和每个名称的最大计数,如果行中的计数等于这两个最大计数,则应该保留它:

代码语言:javascript
复制
df['max_name'] = df.groupby(['Name'])['count'].transform(max)
df['max_type'] = df.groupby(['Type'])['count'].transform(max)

df.query("max_name == count and max_type == count")

    Name    Type    count   max_name    max_type
0   MIR-10  3prime  2       2           2
1   MIR-10  3prime  2       2           2
3   LET-7   5prime  2       2           2
4   LET-7   5prime  2       2           2
5   MIR-142 3prime  2       2           2
7   MIR-142 3prime  2       2           2
票数 2
EN

Stack Overflow用户

发布于 2020-11-09 03:30:53

使用GroupBy.value_counts和使用level检查max会更容易

代码语言:javascript
复制
new_df = df.join(df.groupby('Name', sort=False)['Type']
                   .value_counts()
                   .loc[lambda x: x.eq(x.max(level=0)) | x.eq(x.max(level=1))]
                   .rename('count'), on=['Name', 'Type'], how='right')
print(new_df)

      Name    Type  count
0   MIR-10  3prime      2
1   MIR-10  3prime      2
3    LET-7  5prime      2
4    LET-7  5prime      2
5  MIR-142  3prime      2
7  MIR-142  3prime      2
票数 1
EN

Stack Overflow用户

发布于 2020-11-09 08:15:20

我们可以使用assign方法创建临时列,并筛选计数等于每个组的最大计数的行:

代码语言:javascript
复制
(df.assign(count = lambda x: x.groupby(['Name','Type']).Type.transform('count'),
           maximum = lambda x: x.groupby(['Name'])['count'].transform('max'),
           filter_ = lambda x: x['count'].eq(x['maximum']))
 .loc[lambda x: x.filter_, ['Name','Type','count']]
 )

    Name    Type    count
0   MIR-10  3prime  2
1   MIR-10  3prime  2
3   LET-7   5prime  2
4   LET-7   5prime  2
5   MIR-142 3prime  2
7   MIR-142 3prime  2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64741869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档