pandas 分层列的数据框正则表达式过滤
pandas dataframe regex filtering of hierarchical columns
考虑以下数据框:
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]
为什么会失败,我该怎么做才能获得我想要的过滤?
一种选择是使用str.contains on the get_level_values from columns then use 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
有趣的问题。观察 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
注意:可能它非常依赖于实现。所以不要这样做:)
考虑以下数据框:
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]
为什么会失败,我该怎么做才能获得我想要的过滤?
一种选择是使用str.contains on the get_level_values from columns then use 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
有趣的问题。观察 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
注意:可能它非常依赖于实现。所以不要这样做:)