subset pandas df columns with partial string match OR match before "?"使用姓名列表

subset pandas df columns with partial string match OR match before "?" using lists of names

我希望有人能帮助我。

我有一个数据框,其中包含具有 相似 名称的列(参见示例数据)

我有 3 个额外的列名列表,其中包括列的原始名称(即出现在问号之前的字符串(请参阅列名列表)

我需要根据匹配 3 个列表中列名的第一部分,将 df 数据帧子集化为 3 个单独的数据帧。底部的预期输出。

它必须在列表(或程序化的东西)中,因为我有很多很多这样的专栏。我尝试了模式匹配,但由于某些名称非常相似,因此它们匹配到多个列表。

提前致谢!

示例数据

df = {'id': ['1','2','3','4'],
        'ab? op':  ['green', 'red', 'blue', 'None'],
        'ab? 1': ['red', 'yellow', 'None', 'None'],
        'cd': ['L', 'XL', 'M','L'],
        'efab? cba' : ['husband', 'wife', 'husband', 'None'],
        'efab? 1':['son', 'grandparent', 'son', 'None'],
        'efab? 2':['None', 'son', 'None', 'None'],
        'fab? 4':['9', '10', '5', '3'], 
        'fab? po':['England', 'Scotland', 'Wales', 'NA'] }


df = pd.DataFrame(df, columns = ['id','ab? op', 'ab? 1', 'cd', 'efab? cba', 'efab? 1', 'efab? 2', 'fab? 4', 'fab? po'])

其他3个数据框中的列名列表


df1_lst = ['ab', 'cd']
df2_lst = ['efab']
df3_lst = ['fab']

期望输出

df1 = ['ab? op', 'ab? 1', 'cd']
df2 = ['efab? cba', 'efab? 1', 'efab? 2']
df3 = ['fab? 4', 'fab? po']

? 拆分列名称,保留第一部分并检查它们是否在列表中:

df1 = df.loc[:, df.columns.str.split('?').str[0].isin(df1_lst)]
df2 = df.loc[:, df.columns.str.split('?').str[0].isin(df2_lst)]
df3 = df.loc[:, df.columns.str.split('?').str[0].isin(df3_lst)]
>>> df1
  ab? op   ab? 1  cd
0  green     red   L
1    red  yellow  XL
2   blue    None   M
3   None    None   L

>>> df2
  efab? cba      efab? 1 efab? 2
0   husband          son    None
1      wife  grandparent     son
2   husband          son    None
3      None         None    None

>>> df3
  fab? 4   fab? po
0      9   England
1     10  Scotland
2      5     Wales
3      3        NA

您可以为每个 df 列表形成一个动态正则表达式:

df_lists = [df1_lst, df2_lst, df3_lst]

result = [df.filter(regex=fr"\b({'|'.join(names)})\??") for names in df_lists]

例如,对于第一个列表,regex\b(ab|cd)\?? 即寻找 abcd 但它们应该独立于左侧(\b) 之后可能会有一个可选的 ?

所需条目在 result 列表中,例如

>>> result[1]

  efab? cba      efab? 1 efab? 2
0   husband          son    None
1      wife  grandparent     son
2   husband          son    None
3      None         None    None