代码之家  ›  专栏  ›  技术社区  ›  BlakeB9

如何使用panda在数据帧中返回名称相似的列

  •  0
  • BlakeB9  · 技术社区  · 4 年前

    假设我有一张桌子,看起来像:

    +----------------------------------+-------------------------------------+----------------------------------+
    | ExperienceModifier|ApplicationId | ExperienceModifier|RatingModifierId | ExperienceModifier|ActionResults |
    +----------------------------------+-------------------------------------+----------------------------------+
    |                                  |                                     |                                  |
    +----------------------------------+-------------------------------------+----------------------------------+ 
    

    我想抓取所有以“ExperienceModifier”开头的列,并将其结果填充到自己的数据帧中。我将如何与熊猫一起完成这项任务?

    2 回复  |  直到 4 年前
        1
  •  1
  •   Ynjxsjmh    4 年前

    你可以试试 pandas.DataFrame.filter

    df.filter(like='ExperienceModifier')
    

    如果要获取仅包含的列 ExperienceModifier 一开始。

    df.filter(regex='^ExperienceModifier')
    
        2
  •  1
  •   Acccumulation    4 年前

    Ynjxsjmh的答案将得到所有包含“ExperienceModifier”的列。如果您确实希望列 开始 有了这个字符串,而不仅仅是包含它,你可以 new_df = df[[col for col in df.columns if col[:18] == 'ExperienceModifier']] 。如果所有需要的列都具有 | 在“ExperienceModifier”之后,你也可以 new_df = df[[col for col in df.columns if col.split('|')[0] == 'ExperienceModifier']] 。所有这些都将创建数据帧的视图。如果您想要一个完全独立的数据帧,您应该复制它,如下所示: new_df = df[[col for col in df.columns if col.split('|')[0] == 'ExperienceModifier']].copy() 。您可能还想通过拆分上的列名来创建多索引 | 而不是创建单独的数据帧。

        3
  •  1
  •   Student.py    4 年前

    公认的答案确实有效,但我仍然附上我的“手工版本”,它有效:

    import pandas as pd
    import numpy as np
    import re
    
    lst = [[1, 2, 3, 4],[1, 2, 3, 4],[1, 2, 3, 4]]
    column_names = [['ExperienceModifier|ApplicationId', 'ExperienceModifier|RatingModifierId', 'ExperienceModifier|ActionResults','OtherName|ActionResults']] 
    
    data = pd.DataFrame(lst, columns = column_names) 
    data
    
    
    old_and_dropped_dataframes = []
    new_dataframes=[]    
    for i in np.arange(0,len(column_names[0])):
        column_names[0][i].split("|")
        splits=re.findall(r"[\w']+", column_names[0][i])
        if "ExperienceModifier" in splits:
            new_dataframe = data.iloc[:,[i]]
            new_dataframes.append(new_dataframe)
        else:
            old_and_dropped_dataframe =  data.iloc[:,[i]]
            old_and_dropped_dataframes.append(old_and_dropped_dataframe)
    
    
    
    ExperienceModifier_dataframe = pd.concat(new_dataframes,axis=1)
    ExperienceModifier_dataframe
    
    OtherNames_dataframe = pd.concat(old_and_dropped_dataframes,axis=1)
    OtherNames_dataframe
    

    此脚本从初始数据帧开始创建两个新的数据帧:一个包含名称以开头的列 ExperienceModifier 另一个包含不以开头的列 ExperienceModifier