分层列的熊猫数据框正则表达式过滤

时间:2021-05-19 23:18:44

标签: python regex pandas dataframe hierarchical

考虑以下数据框:

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]

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

2 个答案:

答案 0 :(得分:1)

一种选择是在列中的 str.contains 上使用 get_level_values,然后使用 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

答案 1 :(得分:0)

有趣的问题。观察大熊猫 source code for .filter,大熊猫会将 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

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