考虑以下数据框:
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]
为什么会失败,我该怎么做才能获得我想要的过滤?
答案 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
注意:可能它非常依赖于实现。所以不要这样做:)