如何使用 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 通配过滤。
我正在尝试通过过滤列名来构建 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 通配过滤。