【问题标题】:Call specific columns with regular expression pandas使用正则表达式 pandas 调用特定列
【发布时间】:2019-02-23 10:52:06
【问题描述】:

使用熊猫,我想在循环数据帧时做这样的事情:

    for body_part, columns in zip(self.body_parts, usecols_gen()):
        body_part_df = self.read_csv(usecols=columns)
        if self.normalize:
            body_part_df[r'x(\.\d)?'] = body_part_df[r'x(\.\d)?'].apply(lambda x: x/x_max)
        print(body_part_df)
        result[body_part] = body_part_df

我使用正则表达式是因为我引用的列名是错位的:x、x.1、x.2、...、x.n

这给出了 KeyError,我不明白原因。请帮忙。提前致谢。

【问题讨论】:

    标签: python python-3.x pandas dataframe


    【解决方案1】:

    您不能使用正则表达式查询DataFrame 列,您可以做的是对其进行迭代并将您的函数应用于匹配的列,即:

    import re
    
        # ...
    
        for body_part, columns in zip(self.body_parts, usecols_gen()):
            body_part_df = self.read_csv(usecols=columns)
            if self.normalize:
                for column in body_part_df:
                    if re.match(r"x(\.\d)?", column):  # or re.search() for partial matches
                        body_part_df[column] = body_part_df[column].apply(lambda x: x/x_max)
            print(body_part_df)
            result[body_part] = body_part_df
    

    【讨论】:

    • 这应该是未来的请求吗?还是你认为这没有意义?
    • Pandas 正试图与 PEP 标准配合得很好,因此访问 DataFrame 列就像访问字典一样 - 它旨在确定性、最终性和快速性。您始终可以使用pandas.DataFrame.filter() 仅获取您感兴趣的列(即在您的情况下为body_part_df.filter(regex=r"x(\.\d)?", axis=1)),但在这种情况下,您不妨自己过滤它,因为您还想在进行过程中更新数据.这种情况太罕见了,不能保证特定功能,IMO。
    • 我同意。感谢您的宝贵时间
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    • 1970-01-01
    • 2020-06-08
    • 2018-04-24
    相关资源
    最近更新 更多