質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1013閲覧

csvの列名rename操作(ループ処理)

haruhika

総合スコア14

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/06/10 09:21

編集2019/06/10 09:25

前提・実現したいこと

pandasで列名のrenameを下記のように複数列一度に行いたいです。
※直近を1M、2ヶ月前を2M、3ヶ月前を3M...という表記

[列名]
( 現状 ) → ( rename後 )
@_201905_データ → データ_1M
@_201904_データ → データ_2M
@_201903_データ → データ_3M

ステップは下記を考えていましたが、データ自体の操作ではなく、列名の操作をどのように行えば良いのか困っております。。
①「@201905」のような文字列を含む列名を取得
②「@201905」であれば列名最後に「1M」、「@201904」であれば列名最後に「2M」を付与するループ処理
③「@201905」部分の文字列削除

sampledata

1df=DataFrame([[2190,13378,2190,13378],[1904,13378,2190,13378],[5157,13378,2190,13378]], 2 columns=['area','@_201905_データ','@_201905_データ','@_201905_データ'], 3 index=['Tokyooo','Osaka','Chibaaa'])

ぜひご教授いただけますでしょうか..?
よろしくお願いします。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

各列を変更する関数を作り、DataFrame.rename に指定してください。

rename する関数の内容

  1. pd.to_datetime で "@_{年}{月}_データ" を datetime に変換する。
  2. pd.isna() を調べて、"area" のような "@_{年}{月}_データ" という形式でない列は変更しないでそのまま返す。
  3. 今日の datetime との差分を計算し、何ヶ月前かを調べる。
  4. "データ_{nヶ月前}M" という文字列を返す。

python

1 2 3import pandas as pd 4import numpy as np 5 6df = pd.DataFrame( 7 [ 8 [2190, 13378, 2190, 13378], 9 [1904, 13378, 2190, 13378], 10 [5157, 13378, 2190, 13378], 11 ], 12 columns=["area", "@_201905_データ", "@_201904_データ", "@_201903_データ"], 13 index=["Tokyooo", "Osaka", "Chibaaa"], 14) 15 16 17def renamer(name): 18 # "@_%Y%m_データ" を datetime に変換する。 19 date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce") 20 if pd.isna(date): 21 return name # "@_{年}{月}_データ" という形式でない場合 22 23 # 何ヶ月前かを計算する。 24 months = (pd.to_datetime("today") - date) // np.timedelta64(1, "M") 25 26 return f"データ_{months}M" 27 28 29df.rename(columns=renamer, inplace=True) 30 31print(df) 32# area データ_1M データ_2M データ_3M 33# Tokyooo 2190 13378 2190 13378 34# Osaka 1904 13378 2190 13378 35# Chibaaa 5157 13378 2190 13378

追記

複数パターン存在する場合は、どのようにループさせていけば良いでしょうか..?

pandas.to_datetime() に exact=False を追加してください。
これにより、列名の一部が @_{年}{月}_データ とマッチすれば、日付に変換できます。

pandas.to_datetime — pandas 0.24.2 documentation

変更箇所

diff

1- date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce") 2+ date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce", exact=False)

修正後のコード全体

python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame( 5 [ 6 [2190, 13378, 2190, 13378, 13378, 2190, 13378], 7 [1904, 13378, 2190, 13378, 13378, 2190, 13378], 8 [5157, 13378, 2190, 13378, 13378, 2190, 13378], 9 ], 10 columns=[ 11 "area", 12 "@_201905_データA", 13 "@_201904_データA", 14 "@_201905_データB", 15 "@_201904_データB", 16 "@_201905_データC", 17 "@_201904_データC", 18 ], 19 index=["Tokyooo", "Osaka", "Chibaaa"], 20) 21 22def renamer(name): 23 # "@_%Y%m_データ" を datetime に変換する。 24 date = pd.to_datetime(name, format="@_%Y%m_データ", errors="coerce", exact=False) 25 if pd.isna(date): 26 return name # "@_{年}{月}_データ" という形式でない場合 27 28 # 何ヶ月前かを計算する。 29 months = (pd.to_datetime("today") - date) // np.timedelta64(1, "M") 30 31 return f"データ_{months}M" 32 33 34df.rename(columns=renamer, inplace=True) 35 36print(df) 37# area データ_1M データ_2M データ_1M データ_2M データ_1M データ_2M 38# Tokyooo 2190 13378 2190 13378 13378 2190 13378 39# Osaka 1904 13378 2190 13378 13378 2190 13378 40# Chibaaa 5157 13378 2190 13378 13378 2190 13378

投稿2019/06/10 09:45

編集2019/06/11 04:21
tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruhika

2019/06/11 01:57

早急なご対応ありがとうございます!! 理解できました。。! また、さらにご質問なのですが、 「_データ」の部分が ’_データA’,’_データB’,’_データC’ と複数パターン存在する場合は、どのようにループさせていけば良いでしょうか..? ※下記のようなデータパターンです。 import pandas as pd df = pd.DataFrame( [ [2190, 13378, 2190, 13378,13378, 2190, 13378], [1904, 13378, 2190, 13378,13378, 2190, 13378], [5157, 13378, 2190, 13378,13378, 2190, 13378], ], columns=["area", "@_201905_データA", "@_201904_データA", "@_201905_データB","@_201904_データB","@_201905_データC","@_201904_データC"], index=["Tokyooo", "Osaka", "Chibaaa"], )
tiitoi

2019/06/11 04:20

追記しました。
haruhika

2019/06/11 05:56

ご回答ありがとうございました..! 助かりました。。 無事、データ処理を行うことができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問