【问题标题】:Selecting columns from dataframe based on the name of other dataframe根据其他数据框的名称从数据框中选择列
【发布时间】:2017-05-24 20:20:25
【问题描述】:

我有 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,这两个数据框都有名称列,所以我需要将它合并到数据框df,然后我需要根据数据框名称的最后一部分选择列.也就是说,例如,如果数据帧是df_ID,那么对于来自数据帧Name 的所有匹配行,我需要所有以"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]})

任何帮助都会很棒

【问题讨论】:

  • 使用pd.merge 可以得到您期望的结果。你试过了吗?
  • 能否请您检查我编辑的问题。我试过但我的问题的主要部分是基于文件名的选择列。
  • 您只想保留那些带有ID 的列?
  • 如果 dfs 中的数据框以 _ID 结尾,另一个明智的做法是检查数据框中的名称并根据该名称选择列。也就是说,例如,如果数据框是 df_ID,那么对于来自数据框 df 的名称中的所有匹配行,我需要所有以“ID”+“名称”结尾的列,如果数据框是 df_REL,那么我需要所有列以 df 中的“RE”+“Name”结尾。我想我需要一个 if 循环

标签: python pandas dataframe


【解决方案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_ID、@987654327 @):

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

【讨论】:

  • 非常感谢您的解释和代码。但正如我在问题中提到的,我还需要 df_ID 和 df_RE 中的“名称”列
  • 明白了。如果您还需要添加“名称”,那么它只是对 for 循环中现有代码的简单编辑。将dfs[suffix] = dfs[suffix][cols] 更改为dfs[suffix] = dfs[suffix][cols + ['Name']]
【解决方案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 也可以这样做。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-08
    • 1970-01-01
    • 2020-02-18
    • 1970-01-01
    • 1970-01-01
    • 2017-01-16
    • 2019-04-30
    • 1970-01-01
    相关资源
    最近更新 更多