【问题标题】:Iterate through columns and rename according to a rule遍历列并根据规则重命名
【发布时间】:2016-08-21 04:47:15
【问题描述】:

在下面的 sn-p 代码中,我试图将一些列(包含 Hosted Meetings)重命名为 Hosted Meetings [date]。这就是我打印所有i 时发生的情况。但是,它不会将其保存到 df

all_users_sheets_hosts = []

for f in glob.glob("./users-export-*.xlsx"):
    df = pd.read_excel(f)
    all_users_sheets_hosts.append(df)
    j = re.search('(\d+)', f)
    for i in df.columns.values:
        if 'Hosted Meetings' in i:
            i = ('Hosted Meetings' + ' ' + j.group(1))

【问题讨论】:

    标签: python pandas glob


    【解决方案1】:

    更新上一个答案:

    当前答案现在会引发异常:索引不支持可变操作

    变化:

    df.columns[i] = ('Hosted Meetings' + ' ' + j.group(1))
    

    到:

    df.columns.values[i] = ('Hosted Meetings' + ' ' + j.group(1))
    

    【讨论】:

      【解决方案2】:

      迭代器i 是数组值的副本,而不是指针。解决此问题的一种方法是通过索引而不是值本身来enumerate

      for i, val in enumerate(df.columns.values):
          if 'Hosted Meetings' in val:
              df.columns[i] = ('Hosted Meetings' + ' ' + j.group(1))
      

      但无论如何,这很好地说明了功能性更强的风格的优势。在您的情况下,您可以将列视为str 类型的熊猫系列,因此您可以在其上使用矢量化的replace,在一个语句中重命名您的列:

      df.columns = df.columns.str.replace('.*Hosted Meeings.*', 
                                          'Hosted Meetings' + ' ' + j.group(1))
      

      【讨论】:

      • 太棒了。 python 新手,所以这可以帮助我学习和解决我的问题
      • 不用担心,我已经添加了一些内容来向您展示如何修复您的循环,但是如果您可以解决,使用矢量化操作几乎总是更好(更快/更安全/更少错误)如何。
      • 另外,我将如何在多个列中查找符合某些条件的所有行?
      • 有几种不同的方式,stackoverflow.com/questions/11869910/… 看起来涵盖了其中一些(query 是我最喜欢的)
      • 谢谢@maxymoo,虽然我对此有点困惑,以前从未使用过查询或掩码。假设我想删除标题包含“X”的列中的任何单元格包含“acme”一词的行。我目前的想法是添加一个 for 循环(对于包含 X 的列标题),然后使用先前定义的掩码来删除“acm​​e”行。有没有更好的办法?
      猜你喜欢
      • 2012-03-23
      • 2021-11-02
      • 2018-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2011-12-29
      • 1970-01-01
      相关资源
      最近更新 更多