根据其他数据框的名称从数据框中选择列

时间:2017-05-24 09:34:14

标签: python pandas dataframe

我有3个数据帧, DF

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,

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

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

"RE" + "Name"

但是这里的ID,当数据帧以RE结束时必须再次改变,依此类推,我有几个不同字符串的文件,所以任何更好的解决方案都会很棒

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

结尾
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]

任何帮助都会很棒

2 个答案:

答案 0 :(得分:1)

您可以先将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。

pd.merge(df,df_RE,on='Name')[[e for e in df.columns if e.endswith('RE') or e=='Name']]

答案 1 :(得分:1)

假设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):

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

现在,您可以循环遍历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