如何使用 LIKE 过滤多个列并按顺序排列?

how to filter several columns with LIKE and follow the sequence?

我正在尝试通过过滤列名来构建 pandas 数据框。数据框的样式如下:

NAME_1, EMAIL_1, PHONO_1, POSTALCODE_1, NAME_2, EMAIL_2, PHONO_2, POSTALCODE_2, etc.

我知道要只保留“电子邮件”列,我只需要输入:

df_temp = df.filter(like='EMAIL')

结果如下:

EMAIL_1, EMAIL_2, EMAIL_n

到目前为止一切顺利,但我还想将其他列添加到过滤器中,并遵循链接数据的顺序。我正在寻找类似的东西:

NAME_1, EMAIL_1, NAME_2, EMAIL_2

df_temp = df[df.filter(like='NAME') & df.filter(like='EMAIL')]

但是没用。

下面没有return我需要的数据:

df_temp_1 = df.filter(like='NAME')
df_temp_2 = df.filter(like='EMAIL')
df_temp_3 = pd.concat([df_temp_1, df_temp_2], axis=1)

NAME_1, NAME_2, EMAIL_1, EMAIL_2, etc.

我想将其视为:

NAME_1, EMAIL_1, NAME_2, EMAIL_2

我什至希望能够将它们分成不同的数据帧。

请问有推荐的方法吗?

从已经非常感谢你。

此致

使用regex代替like:

out = df.filter(regex=('^(NAME|EMAIL)'))
print(out)

# Output (sample)
   NAME_1  EMAIL_1  NAME_2  EMAIL_2
0       5        9       5        9
1       8        2       3        9
2       8        8       1        5
3       6        7       9        5
4       6        6       4        3

你可以试试

out = df.filter(regex='(NAME|EMAIL)_[12]')

如果后缀不同

out = df.filter(regex='(NAME_[12]|EMAIL_[3-5])')

检查startswith

out = df.loc[:,df.columns.str.startswith(('NAME','EMAIL'))]

使用正则表达式是最好的解决方案,但您也可以从两个 filters 调用中提取列并将它们与 union:

连接在一起
cols = df.filter(like='NAME').columns.union(df.filter(like='EMAIL').columns)

输出:

>>> cols
Index(['EMAIL_1', 'EMAIL_2', 'NAME_1', 'NAME_2'], dtype='object'

一个选项是 select_columns from pyjanitor:

# pip install pyjanitor
import janitor 
import pandas as pd

In [106]: columns = ['NAME_1', 'EMAIL_1', 'PHONO_1', 'POSTALCODE_1', 'NAME_2','EMAIL_2', 'PHONO_2', 'POSTALCODE_2']

In [107]: df = pd.DataFrame([], columns = columns)

In [108]: df
Out[108]:
Empty DataFrame
Columns: [NAME_1, EMAIL_1, PHONO_1, POSTALCODE_1, NAME_2, EMAIL_2, PHONO_2, POSTALCODE_2]
Index: []

In [109]: df.select_columns('NAME*', 'EMAIL*')
Out[109]:
Empty DataFrame
Columns: [NAME_1, NAME_2, EMAIL_1, EMAIL_2]
Index: []

* 想法基于 unix shell 通配过滤。