我希望有人能帮助我。
我有一个数据帧,它包含具有类似名称的列(参见示例数据(
我有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)??
,即寻找ab
或cd
,但它们应该从左侧独立(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