1

我希望有人可以帮助我。

我有一个包含具有相似名称的列的数据框(请参阅示例数据)

我有 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']
4

2 回答 2

1

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

df_lists = [df1_lst, df2_lst, df3_lst]

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

例如,对于第一个列表,正则表达式\b(ab|cd)\??ie,即查找其中一个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
于 2021-05-11T11:50:29.223 回答
0

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

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
于 2021-05-11T11:43:32.033 回答