【问题标题】:Categorize df based on column orders根据列顺序对 df 进行分类
【发布时间】:2020-06-09 05:56:08
【问题描述】:

我必须按 C、D、E、B、A 的顺序对列进行排序,并按升序对它们进行分类。

在哪里——

  • 带有 False 的 D 和带有 True 的 E 应该在 C 列之后具有最高优先级
  • 列 Max(B) 和 Max(A) 的优先级应排在 C、D 和 E 之后
  • 最后,带零的 C 和 B 的优先级应该最低。(应该有,D 和 E 排在 Max (A) 之后

df

        A   B   C      D      E
    0   8   5   0  False   True
    1  45  35   0   True  False
    2  35  10   1  False   True
    3  40   5   2   True  False
    4  12  10   5  False  False
    5  18  15  13  False   True
    6  25  15   5   True  False
    7  35  10  11  False   True
    8  95  50   0  False  False

按以下列顺序排序的条件:

示例条件顺序:

Max(C), D, E, Max(B) and Max(A) where as C!= 0  and B!=0
Also Column D with `True` and E with `False` should be on the top 

C, D, E, A, Max(B), and Max (A) where as C== 0 and B !=0
Also Column Ds with `True` and Es with `False` on the top 

C, D, E, A, B, and Max(A) where as C== 0 and B ==0
Also Column Ds with `True` and Es with `False` on the top 

示例分类顺序 -

 Category 1 -  C, D(True), E(False), B, A and C!=0
 Category 2 -  C, D(True), E(True), B, A and C!=0
 Category 3 -  C, D(False), E(False), B, A and C!=0
 Category 4 -  C, D(False), E(True), B, A and C!=0

那么考虑C=0

 Category 5 -  B, D(True), E(False), B, A and B!=0 and C=0
 Category 6 -  B, D(True), E(True), B, A and B!=0 and C=0
 Category 7 -  B, D(False), E(False), B, A and B!=0 and C=0
 Category 8 -  B, D(False), E(True), B, A and B!=0 and C=0

等等

我试过了,通过更新升序但没有得到预期的输出:

df.sort_values(['C', 'D','E', 'B', 'A'], ascending=[False, False, False, False, False]) # without category

这是预期的输出:-

   A   B   C      D      E       Category
6  25  15   5   True  False       1    
3  40   5   2   True  False       1
4  12  10   5  False  False       3
5  18  15  13  False   True       4
7  35  10  11  False   True       4
2  35  10   1  False   True       4
1  45  35   0   True  False       5
8  95  50   0  False  False       6
0   8   5   0  False   True       7

【问题讨论】:

  • 输出是否正确? Category 1 - C, D(False), E(True), B, A and C!=0 输出为 6 25 15 5 True False 1 - 未交换 D=True, E=False ?
  • @jezrael - 感谢您的纠正,不,它不正确。让我更正
  • @jezrael - 更新问题,请检查。

标签: python pandas dataframe sorting


【解决方案1】:

使用numpy.selectC,D,E 列设置新条件,然后按默认升序按Category, A, B 列排序:

#test not equal 0
m0 = df['C'].ne(0) 

#chained True & False
m1 = df['D'] & ~df['E']
#chained True & True 
m2 = df['D'] & df['E']
#chained False & False
m3 = ~df['D'] & ~df['E']
#chained False & True
m4 = ~df['D'] & df['E']

df['Category'] = np.select([m0 & m1, m0 & m2, m0 & m3, m0 & m4,
                            ~m0 & m1, ~m0 & m2, ~m0 & m3, ~m0 & m4], [1,2,3,4,5,6,7,8])

df = df.sort_values(['Category','A','B']) 
print (df)
    A   B   C      D      E  Category
6  25  15   5   True  False         1
3  40   5   2   True  False         1
4  12  10   5  False  False         3
5  18  15  13  False   True         4
2  35  10   1  False   True         4
7  35  10  11  False   True         4
1  45  35   0   True  False         5
8  95  50   0  False  False         7
0   8   5   0  False   True         8

【讨论】:

  • @jezrel - 感谢您的快速回答。一个简单的问题,我有 1000 行这样的行,在这种情况下,类别数会增加,例如 8、9、10 ..(我猜最多为 14),因为当 A、B 和C 以及 D 和 E 的组合在那里也很重要。在这种情况下如何更新np.select
  • @jezrel - 可能我必须为m0 | m1 创建范围,` m0 |m2` ...~m0 | m1`...等正确吗?
  • @Laxmikant - 不知道是否理解,也有测试A,B for 0 ?
  • 是的,绝对...A和B也检查了0。但第一优先级应该是C,B然后是A
  • @Laxmikant - 可以解释更多吗?例如,np.random.seed(2020) N = 30 df = pd.DataFrame({'A':np.random.randint(5, size=N), 'B':np.random.randint(4, size=N), 'C':np.random.randint(3, size=N), 'D':np.random.choice([True, False], p=(0.5,0.5),size=N), 'E':np.random.choice([True, False], p=(0.5,0.5),size=N)}) 的输出是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2015-10-29
  • 2019-02-25
相关资源
最近更新 更多