【问题标题】:pandas dataframe regex filtering of hierarchical columns分级列的熊猫数据框正则表达式过滤
【发布时间】:2021-08-09 05:15:13
【问题描述】:

考虑以下数据框:

df = pd.DataFrame(columns=['[mg]', '[mg] true'], index=range(3))

要过滤以] 结尾的列,可以使用:

print(df.filter(regex="\]$"))
  [mg]
0  NaN
1  NaN
2  NaN

接下来,考虑一个分层列数据框:

df1 = pd.DataFrame(columns=pd.MultiIndex.from_product([[0,1], ['[mg]', '[mg] true']]), index=range(3))
print(df1)
     0              1          
  [mg] [mg] true [mg] [mg] true
0  NaN       NaN  NaN       NaN
1  NaN       NaN  NaN       NaN
2  NaN       NaN  NaN       NaN

当我再次尝试过滤以 ] 结尾的相同列时,它现在失败了:

print(df1.filter(regex="\]$"))
Empty DataFrame
Columns: []
Index: [0, 1, 2]

为什么会失败,我该怎么做才能获得我想要的过滤?

【问题讨论】:

    标签: python regex pandas dataframe hierarchical


    【解决方案1】:

    一种选择是在列中的get_level_values 上使用str.contains,然后使用loc 来使用列索引:

    import pandas as pd
    
    df1 = pd.DataFrame(
        columns=pd.MultiIndex.from_product([[0, 1], ['[mg]', '[mg] true']]),
        index=range(3))
    
    # Apply Regex to Level 1 Of the Column Index
    matches = df1.columns.get_level_values(1).str.contains(r"\]$")
    # Filter Using loc
    filtered_df = df1.loc[:, matches]
    print(filtered_df)
    

    filtered_df:

         0    1
      [mg] [mg]
    0  NaN  NaN
    1  NaN  NaN
    2  NaN  NaN
    

    【讨论】:

      【解决方案2】:

      有趣的问题。观察 pandas source code for .filter,pandas 会将来自 Dataframe._get_axis(1) 的字符串提供给正则表达式。在这种情况下,这些是元组(字符串形式):

      MultiIndex([(0,      '[mg]'),
                  (0, '[mg] true'),
                  (1,      '[mg]'),
                  (1, '[mg] true')],
                 )
      

      所以为了只匹配[mg],我们可以修改正则表达式以包含最终的')

      print(df1.filter(regex=r"mg\]\'\)$"))
      

      打印:

           0    1
        [mg] [mg]
      0  NaN  NaN
      1  NaN  NaN
      2  NaN  NaN
      

      注意:可能它非常依赖于实现。所以不要这样做:)

      【讨论】:

      • 有趣的是,过滤器将元组视为字符串。正则表达式不会只是 r"\]\'\)$"' 来匹配 OP 的当前表达式吗?
      • @HenryEcker 是的,当然。我刚刚添加了它作为示例
      猜你喜欢
      • 1970-01-01
      • 2016-01-15
      • 2017-06-18
      • 2018-01-11
      • 2021-03-13
      • 2020-10-23
      • 2019-07-18
      • 2021-09-26
      • 2021-07-09
      相关资源
      最近更新 更多