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

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

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

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

pandas

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

Q&A

解決済

2回答

1381閲覧

DataFrameに3層目の列名を追加したい

tetsuk

総合スコア6

Python

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

pandas

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

0グッド

0クリップ

投稿2021/08/11 15:41

編集2021/08/11 17:41

前提・実現したいこと

import pandas as pd import numpy as np df = pd.DataFrame(data=np.arange(24).reshape(4, 6)) df.columns = pd.MultiIndex.from_product([['A', 'B'], ['a', 'b', 'c']]) display(df)

で得られるDataFrame
イメージ説明
に3層目の列名を追加し、

1 ----------------- A | B ----------------- a b c | a b c -----------------

のようなインデックスを実現したいのですが、上手くできません。
※ 実コードは前提が長いため、サンプルで書かせていただきました。

試したこと①

df.columns = pd.MultiIndex.from_product([['1'], df.columns]) diplay(df)

で書こうとしましたが、

--------------------------------------------------------------------------- NotImplementedError Traceback (most recent call last) <ipython-input-5-3f8355c6b72e> in <module>() ----> 1 df.columns = pd.MultiIndex.from_product([['1'], df.columns]) 2 diplay(df) 11 frames pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__() pandas/_libs/properties.pyx in pandas._libs.properties.CachedProperty.__get__() /usr/local/lib/python3.7/dist-packages/pandas/core/dtypes/missing.py in _isna(obj, inf_as_na) 151 # hack (for now) because MI registers as ndarray 152 elif isinstance(obj, ABCMultiIndex): --> 153 raise NotImplementedError("isna is not defined for MultiIndex") 154 elif isinstance(obj, type): 155 return False NotImplementedError: isna is not defined for MultiIndex

というエラーが発生して、上手くいきませんでした。

試したこと②

df.columns = pd.MultiIndex.from_tuples(zip(['1'] * len(df.columns), df.columns)) display(df)

も試してみましたが、
イメージ説明
となり、実現したい結果とは異なりました。

試したこと③

df.columns = pd.MultiIndex.from_tuples([("1", i, j) for i in ['A', 'B'] for j in ['a', 'b', 'c']]) display(df)

は、このサンプルでは上手くいくのですが、
実コードでは、リスト内の順番を正しく反映できず
(そもそも外部ソースから抽出するデータのため、コードの切れ目で元の列インデックスのリストを出力させた上で、
全部を目で確認した上でリストを再現するのは難しいです)、
その後の分析で正しい数値を出力することができませんでした。

補足情報(FW/ツールのバージョンなど)

python3

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

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

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

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

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

guest

回答2

0

解決済みとなっていますが、以下のコードのほうが単純ですし、(データフレームのサイズが巨大でない場合)処理も高速ですので、参考として投稿しておきます。

python

1df = pd.concat({1: df}, axis=1)

投稿2021/08/13 00:58

kirara0048

総合スコア1399

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

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

tetsuk

2021/08/17 14:42

目から鱗です。大変参考になりました。ありがとうございます。
guest

0

ベストアンサー

以下のようにします。

python

1>>> print(df) 2 A B 3 a b c a b c 40 0 1 2 3 4 5 51 6 7 8 9 10 11 62 12 13 14 15 16 17 73 18 19 20 21 22 23 8>>> df.columns = pd.Index([(1, *x) for x in df.columns]) 9>>> print(df) 10 1 11 A B 12 a b c a b c 130 0 1 2 3 4 5 141 6 7 8 9 10 11 152 12 13 14 15 16 17 163 18 19 20 21 22 23

投稿2021/08/11 18:18

ppaul

総合スコア24666

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

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

tetsuk

2021/08/12 01:26

できました!ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問