2016-04-27 9 views
1

次のコードの一部では、(Hosted Meetingsを含む)一部の列の名前を「Hosted Meetings [date]」に変更しようとしています。これは私がすべてを印刷するときに起こることです。しかし、これは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のパンダシリーズとして列を扱うことができ、ひいてはあなたは1つのステートメントであなたの列の名前を変更し、その上にベクトル化replaceを使用することができます。

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

ワンダフル。これは私が学ぶのを助けてくれるので、私の問題を解決するのに役立ちます –

+0

私はもう少しあなたのループを修正する方法を示すために追加しましたが、ベクター化された操作を使うことはほとんどいつもより速く(より速く/安全/あなたがどのように働くことができれば。 – maxymoo

+0

また、いくつかの基準に適合する複数の列のすべての行を検索するにはどうすればよいですか? –

関連する問題