2016-04-27 4 views
1

В следующем фрагменте кода я пытаюсь переименовать некоторые столбцы (содержащие «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)) 

ответ

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, и, следовательно, вы можете использовать vectorised replace на нем, чтобы переименовать столбцы в одной инструкции:

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

Замечательно. Новое для python, так что это помогает мне учиться и с моей проблемой –

+0

не волнует, я добавил немного больше, чтобы показать вам, как исправить ваш цикл, однако почти всегда лучше (быстрее/безопаснее/меньше багги) использовать векторную операцию если вы можете решить, как это сделать. – maxymoo

+0

Кроме того, как я могу искать все строки в нескольких столбцах, которые соответствуют некоторым критериям? –

Смежные вопросы