根据其他datafram的名称从dataframe中选择列

2024-09-30 22:12:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我有3个数据帧, 测向

df = pd.DataFrame({'Name': ['CTA15', 'CTA16', 'AC007', 'AC007', 'AC007'], 
'AA_ID': [22, 22, 2, 2, 2], 
'BB_ID':[4, 5, 6, 8, 9], 
'CC_ID' : [2, 2, 3, 3, 3],
  'DD_RE': [4,7,8,9,0],
    'EE_RE':[5,8,9,9,10]})

和df逖ID

^{pr2}$

另一个是df_RE,这两个数据帧都有列名,所以我需要将它合并到数据帧df中,然后根据数据帧名称的最后一部分来选择列。也就是说,例如,如果数据帧是df_ID,那么我需要所有以"ID" + "Name"结尾的列,用于来自数据帧df的所有匹配行,如果数据帧id df_REL,那么我需要df中所有以"RE" + "Name"结尾的列,并且我想单独保存它。 我知道我可以在循环内部打电话

for dfs in dataframes:

    ID=[col for col in df.columns if '_ID' in col]
    df_ID=pd.merge(df,df_ID,on='Name')
    df_ID=df_ID[ID]

但是这里的ID,必须在数据帧以RE结尾时再次更改,等等,我有两个不同字符串的文件,所以任何更好的解决方案都会很好

最后,我需要df_ID,因为所有列都以ID结尾

 df_ID = pd.DataFrame({'Name': ['CTA15', 'CTA16'],
                        'AA_ID': [22, 22'],
                         'BB_ID':[4, 5],
                           'CC_ID' : [2, 2]})

任何帮助都很好


Tags: 数据nameinreiddataframedf结尾
2条回答

您可以先将df与df_ID合并,然后取以ID结尾的列

pd.merge(df,df_ID,on='Name')[[e for e in df.columns if e.endswith('ID') or e=='Name']]
Out[121]: 
   AA_ID  BB_ID  CC_ID   Name
0     22      4      2  CTA15
1     22      5      2  CTA16

同样,这也可以用于df_RE df。在

^{pr2}$

假设您在df中的列是Name以及任何带有后缀(例如,_ID_RE)的后缀,那么您可以通过列名进行解析,首先提取所有唯一的可能的后缀:

# since the suffixes follow a pattern of `_*`, then I can look for the `_` character
suffixes = list(set([col[-3:] for col in df.columns if '_' in col]))

现在,有了后缀列表,接下来要创建一个现有数据帧的字典,其中字典中的键是后缀,值是带有后缀名的数据帧(例如df_IDdf_RE):

^{pr2}$

现在,您可以在suffixes列表中循环以提取列表中每个后缀的相应列,并执行合并和列提取:

for suffix in suffixes:
    cols = [col for col in df.columns if suffix in col]
    dfs[suffix] = pd.merge(df, dfs[suffix], on='Name')
    dfs[suffix] = dfs[suffix][cols]

现在有了后缀数据帧的字典。如果希望将数据帧作为单独的变量,而不是将它们保存在字典中,现在可以将它们设置为单个对象:

df_ID = dfs['_ID']
df_RE = dfs['_RE']
... # and so forth

在一个例子中把它们放在一起

import pandas as pd
df = pd.DataFrame({'Name': ['CTA15', 'CTA16', 'AC007', 'AC007', 'AC007'],
                   'AA_ID': [22, 22, 2, 2, 2],
                   'BB_ID': [4, 5, 6, 8, 9],
                   'CC_ID': [2, 2, 3, 3, 3],
                   'DD_RE': [4, 7, 8, 9, 0],
                   'EE_RE': [5, 8, 9, 9, 10]})

# Get unique suffixes
suffixes = list(set([col[-3:] for col in df.columns if '_' in col]))

dfs = {}  # dataframes dictionary

df_ID = pd.DataFrame({'Name': ['CTA15', 'CTA16', 'CFV', 'SAP', 'SOS']})
df_RE = pd.DataFrame({'Name': ['AC007']})

dfs['_ID'] = df_ID
dfs['_RE'] = df_RE

for suffix in suffixes:
    cols = [col for col in df.columns if suffix in col]
    dfs[suffix] = pd.merge(df, dfs[suffix], on='Name')
    dfs[suffix] = dfs[suffix][cols]

df_ID = dfs['_ID']
df_RE = dfs['_RE']

print(df_ID)
print(df_RE)

结果:

   AA_ID  BB_ID  CC_ID
0     22      4      2
1     22      5      2
   DD_RE  EE_RE
0      8      9
1      9      9
2      0     10

相关问题 更多 >