子集熊猫 df 列,具有部分字符串匹配 OR 使用名称列表"?"前匹配



我希望有人能帮助我。

我有一个数据帧,它包含具有类似名称的列(参见示例数据(

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

您可以为每个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)??,即寻找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

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

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

相关内容

  • 没有找到相关文章

最新更新