大熊猫:根据复杂的逻辑删除具有特定字符串的行和列

Mayank porwal

以下是我的数据框:

df = pd.DataFrame({'A': ['a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'all', 'all', 'all', 'all', 'all', 'all', 'all', 'all', 'all'],
              'B': ['b1', 'b1', 'b1', 'b2', 'b2', 'b2', 'all', 'all', 'all', 'b1', 'b1', 'b1', 'b2', 'b2', 'b2', 'all', 'all', 'all'],
              'C': ['c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2', 'all'],
              'D': ['D1', 'D2', 'all', 'D1', 'D2', 'all', 'D1', 'D2', 'all', 'D1', 'D2', 'all', 'D1', 'D2', 'all', 'D1', 'D2', 'all'],
              'E': ['E1', 'E1', 'E1', 'E2', 'E2', 'E2', 'all', 'all', 'all', 'E1', 'E1', 'E1', 'E2', 'E2', 'E2', 'all', 'all', 'all'],
              'F': [1,2,3,4,5,6,7,8,9,1,2,3,4,5,6,7,8,9]})

在之后pivot,下面是输出:

In [226]: df.pivot(index=['A', 'B', 'C'], columns=['E', 'D'])
Out[226]: 
               F                          (NO)  (NO)           
E             E1   E1  E1    E2   E2  E2   all  all  all      
D             D1   D2  all   D1   D2  all   D1   D2  all
A   B   C                                               
a1  all all  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  9.0 
a1  all c1   NaN  NaN  NaN  NaN  NaN  NaN  7.0  NaN  NaN  -> (NO)
a1  all c2   NaN  NaN  NaN  NaN  NaN  NaN  NaN  8.0  NaN  -> (NO)
a1  b1  all  NaN  NaN  3.0  NaN  NaN  NaN  NaN  NaN  NaN
a1  b1  c1   1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN
a1  b1  c2   NaN  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN
a1  b2  all  NaN  NaN  NaN  NaN  NaN  6.0  NaN  NaN  NaN
a1  b2  c1   NaN  NaN  NaN  4.0  NaN  NaN  NaN  NaN  NaN
a1  b2  c2   NaN  NaN  NaN  NaN  5.0  NaN  NaN  NaN  NaN
all all all  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  9.0
all all c1   NaN  NaN  NaN  NaN  NaN  NaN  7.0  NaN  NaN  -> (NO)
all all c2   NaN  NaN  NaN  NaN  NaN  NaN  NaN  8.0  NaN  -> (NO)
all b1  all  NaN  NaN  3.0  NaN  NaN  NaN  NaN  NaN  NaN  -> (NO)
all b1  c1   1.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  -> (NO)
all b1  c2   NaN  2.0  NaN  NaN  NaN  NaN  NaN  NaN  NaN  -> (NO)
all b2  all  NaN  NaN  NaN  NaN  NaN  6.0  NaN  NaN  NaN  -> (NO)
all b2  c1   NaN  NaN  NaN  4.0  NaN  NaN  NaN  NaN  NaN  -> (NO)
all b2  c2   NaN  NaN  NaN  NaN  5.0  NaN  NaN  NaN  NaN  -> (NO)

我需要删除指出的行和列(NO)

逻辑是:从最内部的索引(即)开始C,我需要将行和列保持all在向后的位置。所以,用索引行a1 all alla1 b1 alla1 b2 allall all all被保持,因为all在一个向后的方式发生。

行索引a1 all c1a1 all c2all all c1all b1 all,被删除等需求,因为有一个在没有连续性all,从开始倒退C

列也采用相同的逻辑。从开始D,需要删除索引列的D1 allD2 all,其余的都很好。

预期产量:

In [227]: result_df
Out[227]: 
               F                          
E             E1   E1  E1    E2   E2  E2   all      
D             D1   D2  all   D1   D2  all  all
A   B   C                                     
a1  all all  NaN  NaN  NaN  NaN  NaN  NaN  9.0 
a1  b1  all  NaN  NaN  3.0  NaN  NaN  NaN  NaN
a1  b1  c1   1.0  NaN  NaN  NaN  NaN  NaN  NaN
a1  b1  c2   NaN  2.0  NaN  NaN  NaN  NaN  NaN
a1  b2  all  NaN  NaN  NaN  NaN  NaN  6.0  NaN
a1  b2  c1   NaN  NaN  NaN  4.0  NaN  NaN  NaN
a1  b2  c2   NaN  NaN  NaN  NaN  5.0  NaN  NaN
all all all  NaN  NaN  NaN  NaN  NaN  NaN  9.0

用新数据更新:

df = pd.DataFrame({'A': ['a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'a1', 'all', 'all', 'all', 'all', 'all',
                                 'all::1::2', 'all::2', 'all', 'all'],
                           'B': ['b1', 'b1', 'b1', 'b2', 'b2', 'b2', 'all', 'all::3::4', 'all', 'b1', 'b1', 'b1', 'b2', 'b2',
                                 'b2', 'all', 'all', 'all'],
                           'C': ['c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2', 'all', 'c1', 'c2',
                                 'all', 'c1', 'c2', 'all::5::all'],
                           'D': ['D1', 'D2', 'all', 'D1', 'D2', 'all::3::2', 'D1', 'D2', 'all', 'D1', 'D2', 'all', 'D1', 'D2',
                                 'all', 'D1', 'D2', 'all'],
                           'E': ['E1', 'E1', 'E1', 'E2', 'E2', 'E2', 'all', 'all', 'all', 'E1', 'E1', 'E1', 'E2', 'E2',
                                 'E2', 'all::1::2', 'all', 'all'],
                           'measure_F': [1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9]})

之后pivot

In [334]: df
Out[334]: 
                                measure_F                                (NO) (NO)                (NO)         
E                                      E1             E2                 all             E2 all::1::2
D                                      D1   D2  all   D1   D2 all::3::2   D1   D2  all  all        D1
A         B         C                                                                                
a1        all       all               NaN  NaN  NaN  NaN  NaN       NaN  NaN  NaN  9.0  NaN       NaN
                    c1                NaN  NaN  NaN  NaN  NaN       NaN  7.0  NaN  NaN  NaN       NaN  -> (NO)
          all::3::4 c2                NaN  NaN  NaN  NaN  NaN       NaN  NaN  8.0  NaN  NaN       NaN  -> (NO)
          b1        all               NaN  NaN  3.0  NaN  NaN       NaN  NaN  NaN  NaN  NaN       NaN
                    c1                1.0  NaN  NaN  NaN  NaN       NaN  NaN  NaN  NaN  NaN       NaN
                    c2                NaN  2.0  NaN  NaN  NaN       NaN  NaN  NaN  NaN  NaN       NaN
          b2        all               NaN  NaN  NaN  NaN  NaN       6.0  NaN  NaN  NaN  NaN       NaN
                    c1                NaN  NaN  NaN  4.0  NaN       NaN  NaN  NaN  NaN  NaN       NaN
                    c2                NaN  NaN  NaN  NaN  5.0       NaN  NaN  NaN  NaN  NaN       NaN
all       all       all::5::all       NaN  NaN  NaN  NaN  NaN       NaN  NaN  NaN  9.0  NaN       NaN
                    c2                NaN  NaN  NaN  NaN  NaN       NaN  NaN  8.0  NaN  NaN       NaN  -> (NO)
          b1        all               NaN  NaN  3.0  NaN  NaN       NaN  NaN  NaN  NaN  NaN       NaN  -> (NO)
                    c1                1.0  NaN  NaN  NaN  NaN       NaN  NaN  NaN  NaN  NaN       NaN  -> (NO)
                    c2                NaN  2.0  NaN  NaN  NaN       NaN  NaN  NaN  NaN  NaN       NaN  -> (NO)
          b2        c1                NaN  NaN  NaN  4.0  NaN       NaN  NaN  NaN  NaN  NaN       NaN  -> (NO)
                    c2                NaN  NaN  NaN  NaN  5.0       NaN  NaN  NaN  NaN  NaN       NaN  -> (NO)
all::1::2 b2        all               NaN  NaN  NaN  NaN  NaN       NaN  NaN  NaN  NaN  6.0       NaN  -> (NO)
all::2    all       c1                NaN  NaN  NaN  NaN  NaN       NaN  NaN  NaN  NaN  NaN       7.0  -> (NO)

更新2:

df = pd.DataFrame({'A':['test', 'test', 'test', 'test', 'test'], 'B':['a', 'b', 'c', 'd', 'e'], 'C':['x', 'x', 'all_group', 'y', 'y'], 'D':['abc', 'all_group::1::all_group', 'all_group::1::all_group', 'abc', 'abc'], 'E':[13, 36, 26, 39,40]})

In [599]: df.pivot(index=['A', 'B'], columns=['C', 'D'])
Out[599]: 
           E                                                      
C          x                                       all_group     y
D        abc all_group::1::all_group all_group::1::all_group   abc
A    B                                                            
test a  13.0                     NaN                     NaN   NaN
     b   NaN                    36.0                     NaN   NaN
     c   NaN                     NaN                    26.0   NaN
     d   NaN                     NaN                     NaN  39.0
     e   NaN                     NaN                     NaN  40.0
耶斯列尔

为创建模板indexcolumns与助手DataFrame的最后通行证DataFrame.loc

df1 = df.index.to_frame()
m1 = df1.where(df1=='all').bfill(axis=1).count(axis=1).isin([0, df.index.nlevels])
df2 = df.columns.to_frame()
m2 = df2.where(df2=='all').bfill(axis=1).count(axis=1).isin([0, df.columns.nlevels])

df = df.loc[m1, m2]
print (df)    
                F                              
E             E1             E2            all
D             D1   D2  all   D1   D2  all  all
A   B   C                                     
a1  all all  NaN  NaN  NaN  NaN  NaN  NaN  9.0
    b1  all  NaN  NaN  3.0  NaN  NaN  NaN  NaN
        c1   1.0  NaN  NaN  NaN  NaN  NaN  NaN
        c2   NaN  2.0  NaN  NaN  NaN  NaN  NaN
    b2  all  NaN  NaN  NaN  NaN  NaN  6.0  NaN
        c1   NaN  NaN  NaN  4.0  NaN  NaN  NaN
        c2   NaN  NaN  NaN  NaN  5.0  NaN  NaN
all all all  NaN  NaN  NaN  NaN  NaN  NaN  9.0
    b1  all  NaN  NaN  3.0  NaN  NaN  NaN  NaN
    b2  all  NaN  NaN  NaN  NaN  NaN  6.0  NaN
 

详细资料

使用MultiIndex.to_frameDataFrame

print (df.index.to_frame())    

               A    B    C
A   B   C                 
a1  all all   a1  all  all
        c1    a1  all   c1
        c2    a1  all   c2
    b1  all   a1   b1  all
        c1    a1   b1   c1
        c2    a1   b1   c2
    b2  all   a1   b2  all
        c1    a1   b2   c1
        c2    a1   b2   c2
all all all  all  all  all
        c1   all  all   c1
        c2   all  all   c2
    b1  all  all   b1  all
        c1   all   b1   c1
        c2   all   b1   c2
    b2  all  all   b2  all
        c1   all   b2   c1
        c2   all   b2   c2

然后将non替换all为缺失值DataFrame.where

print (df1.where(df1=='all'))
               A    B    C
A   B   C                 
a1  all all  NaN  all  all
        c1   NaN  all  NaN
        c2   NaN  all  NaN
    b1  all  NaN  NaN  all
        c1   NaN  NaN  NaN
        c2   NaN  NaN  NaN
    b2  all  NaN  NaN  all
        c1   NaN  NaN  NaN
        c2   NaN  NaN  NaN
all all all  all  all  all
        c1   all  all  NaN
        c2   all  all  NaN
    b1  all  all  NaN  all
        c1   all  NaN  NaN
        c2   all  NaN  NaN
    b2  all  all  NaN  all
        c1   all  NaN  NaN
        c2   all  NaN  NaN

回填非错误,在这里all,通过bfill

print (df1.where(df1=='all').bfill(axis=1))
               A    B    C
A   B   C                 
a1  all all  all  all  all
        c1   all  all  NaN
        c2   all  all  NaN
    b1  all  all  all  all
        c1   NaN  NaN  NaN
        c2   NaN  NaN  NaN
    b2  all  all  all  all
        c1   NaN  NaN  NaN
        c2   NaN  NaN  NaN
all all all  all  all  all
        c1   all  all  NaN
        c2   all  all  NaN
    b1  all  all  all  all
        c1   all  NaN  NaN
        c2   all  NaN  NaN
    b2  all  all  all  all
        c1   all  NaN  NaN
        c2   all  NaN  NaN

计算非缺失值DataFrame.count

print (df1.where(df1=='all').bfill(axis=1).count(axis=1))
A    B    C  
a1   all  all    3
          c1     2
          c2     2
     b1   all    3
          c1     0
          c2     0
     b2   all    3
          c1     0
          c2     0
all  all  all    3
          c1     2
          c2     2
     b1   all    3
          c1     1
          c2     1
     b2   all    3
          c1     1
          c2     1

测试是否0-表示回填的行/列,以及是否全部NaN与级别数匹配MultiIndex.nlevels

print (df1.where(df1=='all').bfill(axis=1).count(axis=1).isin([0, df.index.nlevels]))
 A    B    C  
a1   all  all     True
          c1     False
          c2     False
     b1   all     True
          c1      True
          c2      True
     b2   all     True
          c1      True
          c2      True
all  all  all     True
          c1     False
          c2     False
     b1   all     True
          c1     False
          c2     False
     b2   all     True
          c1     False
          c2     False
dtype: bool

编辑:这里是比较子trings,然后通过np.triu仅与Falses行链接创建的辅助数组的mask的所有值

f = lambda x: x.str.contains('all')
arr1 = np.triu(np.ones((df.index.nlevels,df.index.nlevels), dtype=bool), False)
arr2 = np.triu(np.ones((df.columns.nlevels,df.columns.nlevels), dtype=bool), False)
print (arr1)
[[ True  True  True]
 [False  True  True]
 [False False  True]]

arr11 = df.index.to_frame().astype(str).apply(f).to_numpy()
arr22 = df.columns.to_frame().astype(str).apply(f).to_numpy()

#https://stackoverflow.com/a/51352806/2901002
m1 = (arr11[:, None] == arr1).all(-1).any(axis=1) | ~arr11.any(axis=1)
m2 = (arr22[:, None] == arr2).all(-1).any(axis=1) | ~arr22.any(axis=1)

df = df.loc[m1, m2]
print (df) 
                    measure_F                                       
E                          E1             E2                 all  E2
D                          D1   D2  all   D1   D2 all::3::2  all all
A   B   C                                                           
a1  all all               NaN  NaN  NaN  NaN  NaN       NaN  9.0 NaN
    b1  all               NaN  NaN  3.0  NaN  NaN       NaN  NaN NaN
        c1                1.0  NaN  NaN  NaN  NaN       NaN  NaN NaN
        c2                NaN  2.0  NaN  NaN  NaN       NaN  NaN NaN
    b2  all               NaN  NaN  NaN  NaN  NaN       6.0  NaN NaN
        c1                NaN  NaN  NaN  4.0  NaN       NaN  NaN NaN
        c2                NaN  NaN  NaN  NaN  5.0       NaN  NaN NaN
all all all::5::all       NaN  NaN  NaN  NaN  NaN       NaN  9.0 NaN

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何根据大熊猫中的特定字符串选择实际的行和以上?

来自分类Dev

如何将大熊猫列分为带有字符串和整数的两列

来自分类Dev

如何根据条件删除大熊猫中的行?

来自分类Dev

如何删除大熊猫中与上述行具有相同值的行?

来自分类Dev

根据大熊猫中多列的条件删除随机N行

来自分类Dev

如何根据大熊猫中一列的条件删除行?

来自分类Dev

大熊猫从具有特定条件的数据帧(分组)中删除重复项

来自分类Dev

当特定列的连续行值大于数字时,大熊猫将删除行

来自分类Dev

大熊猫:计算下排的字符串条件

来自分类Dev

大熊猫不承认“||” 作为字符串分割

来自分类Dev

大熊猫结合成串的字符串

来自分类Dev

大熊猫:加载csv时跳过字符串

来自分类Dev

如何解决大熊猫加起来像字符串,而不是数字的行?

来自分类Dev

大熊猫:合并具有相同列名的大熊猫列

来自分类Dev

大熊猫:将多列转换为字符串

来自分类Dev

大熊猫-如果存在部分字符串匹配,则将值放在新列中

来自分类Dev

大熊猫数据框,按列比较2组的字符串值

来自分类Dev

大熊猫-如果存在部分字符串匹配,则将值放在新列中

来自分类Dev

大熊猫:按组插入空白行和具有索引的行?

来自分类Dev

大熊猫遍历行和列,并根据某些条件进行打印

来自分类Dev

移位大熊猫数据帧的特定列的特定行

来自分类Dev

删除第1列和第2列中具有相同字符串的行

来自分类Dev

分组删除存在重复行的列。大熊猫

来自分类Dev

删除在特定列中具有空字符串的行

来自分类Dev

大熊猫获得具有一定值的行的列平均值?

来自分类Dev

大熊猫将带有元组的数据框列扩展为多个列和行

来自分类Dev

对角跨大熊猫的行和列复制值?

来自分类Dev

python大熊猫删除字符

来自分类常见问题

Python:在大熊猫的每一行中用大括号替换尖括号和它的字符串

Related 相关文章

  1. 1

    如何根据大熊猫中的特定字符串选择实际的行和以上?

  2. 2

    如何将大熊猫列分为带有字符串和整数的两列

  3. 3

    如何根据条件删除大熊猫中的行?

  4. 4

    如何删除大熊猫中与上述行具有相同值的行?

  5. 5

    根据大熊猫中多列的条件删除随机N行

  6. 6

    如何根据大熊猫中一列的条件删除行?

  7. 7

    大熊猫从具有特定条件的数据帧(分组)中删除重复项

  8. 8

    当特定列的连续行值大于数字时,大熊猫将删除行

  9. 9

    大熊猫:计算下排的字符串条件

  10. 10

    大熊猫不承认“||” 作为字符串分割

  11. 11

    大熊猫结合成串的字符串

  12. 12

    大熊猫:加载csv时跳过字符串

  13. 13

    如何解决大熊猫加起来像字符串,而不是数字的行?

  14. 14

    大熊猫:合并具有相同列名的大熊猫列

  15. 15

    大熊猫:将多列转换为字符串

  16. 16

    大熊猫-如果存在部分字符串匹配,则将值放在新列中

  17. 17

    大熊猫数据框,按列比较2组的字符串值

  18. 18

    大熊猫-如果存在部分字符串匹配,则将值放在新列中

  19. 19

    大熊猫:按组插入空白行和具有索引的行?

  20. 20

    大熊猫遍历行和列,并根据某些条件进行打印

  21. 21

    移位大熊猫数据帧的特定列的特定行

  22. 22

    删除第1列和第2列中具有相同字符串的行

  23. 23

    分组删除存在重复行的列。大熊猫

  24. 24

    删除在特定列中具有空字符串的行

  25. 25

    大熊猫获得具有一定值的行的列平均值?

  26. 26

    大熊猫将带有元组的数据框列扩展为多个列和行

  27. 27

    对角跨大熊猫的行和列复制值?

  28. 28

    python大熊猫删除字符

  29. 29

    Python:在大熊猫的每一行中用大括号替换尖括号和它的字符串

热门标签

归档