【问题标题】:pandas group by devide rows into 3 groups with conditionallypandas group by 有条件地将行分成 3 组
【发布时间】:2018-07-05 04:09:32
【问题描述】:

我有这样的df。

import pandas as pd
import numpy as np
user = pd.DataFrame({'User':['101','101','101','102','102','101','101','102','102','102','102','102'],'Country':['India','Japan','India','Brazil','Japan','UK','Austria','Japan','Singapore','UK','UK','UK']
                    ,'Count':[85,78,70,5,6,8,60,30,5,6,5,4]})

我想对计数列进行排序并将前 30% 的行分配给第 3 组,然后将接下来的 30% 分配给第 2 组,剩下的 30% 分配给第 1 组。我该怎么做。这是我的预期输出。前 4 列。并查看我的计算我如何划分 30%、30%、40%

【问题讨论】:

  • 试试pd.cut()(有据可查)。

标签: python python-3.x pandas group-by


【解决方案1】:

您需要先按sort_values 对列进行排序,然后使用带有numpy.split 的自定义函数对groupby 进行排序,并将每个组的长度返回到新DataFrame 的新行:

来自完美MaxU answer的想法,谢谢。


用于顶部30-30-30:

user = user.sort_values(['User','Count'], ascending=[True, False])

def f(x):
    #split to 4 groups, because 3 + 3 + 3 != 1 
    a, b, c, d = np.split(x, [int(.3*len(x)), int(.6*len(x)), int(.9*len(x))])
    return pd.Series([len(a), len(b), len(c)], index=['30','30','30'])

df = user.groupby('User').apply(f)
df['sum'] = df.sum(axis=1)
print (df)
      30  30  30  sum
User                 
101    1   2   1    4
102    2   2   2    6

对于30-30-40

user = user.sort_values(['User','Count'], ascending=[True, False])

def f(x):
    #split to 3 groups, because 3 + 3 + 4 == 1
    a, b, c = np.split(x, [int(.3*len(x)), int(.6*len(x))])
    return pd.Series([len(a), len(b), len(c)], index=['30','30','40'])

df = user.groupby('User').apply(f)
df['sum'] = df.sum(axis=1)
print (df)

      30  30  40  sum
User                 
101    1   2   2    5
102    2   2   3    7

编辑:

群组应该由list comprehension创建:

def f(x):
    a, b, c = np.split(x.index, [int(.3*len(x)), int(.6*len(x))])
    L = [a,b,c]
    return [i for i, y in zip(range(len(L),0,-1) ,L) for j in y]

user['Groups'] = user.groupby('User')['User'].transform(f)
print (user)
   User    Country  Count  Groups
0   101      India     85       3
1   101      Japan     78       2
2   101      India     70       2
6   101    Austria     60       1
5   101         UK      8       1
7   102      Japan     30       3
4   102      Japan      6       3
9   102         UK      6       2
3   102     Brazil      5       2
8   102  Singapore      5       1
10  102         UK      5       1
11  102         UK      4       1

【讨论】:

  • 如何根据每组的行数获取原始数据集中的组列?
  • 如果您看到我想要的输出,则有一个列名组。
  • @KumarAK 礼貌而不是苛求怎么样? Jezrael 是一名志愿者,他为您提供业余时间和专业知识。与其先说谢谢,不如说是抱怨。
  • 感谢您一直以来对 jezrael 的支持
  • @KumarAK - 为团体添加了解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-08-28
  • 2018-03-05
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
  • 2011-10-12
相关资源
最近更新 更多