パンダ:マルチレベルの列を作成する方法


8

私は次の列を持つパンダのデータフレームを持っています:

n_0
n_1
p_0
p_1
e_0
e_1

列とサブ列を持つように変換したい:

0
    n
    p
    e
1
    n
    p
    e

私はドキュメントを検索しましたが、これを実装する方法が完全にわかりません。誰か提案はありますか?

回答:


1

最後に、私は解決策を見つけました。

以下のスクリプト例を見つけることができます。

#!/usr/bin/env python3
import pickle
import pandas as pd
import itertools
import numpy as np

data = pd.DataFrame(np.random.randn(10, 5), columns=('0_n', '1_n', '0_p', '1_p', 'x'))

indices = set()
groups = set()
others = set()
for c in data.columns:
    if '_' in c:
        (i, g) = c.split('_')
        c2 = pd.MultiIndex.from_tuples((i, g),)
        indices.add(int(i))
        groups.add(g)
    else:
        others.add(c)
columns = list(itertools.product(groups, indices))
columns = pd.MultiIndex.from_tuples(columns)
ret = pd.DataFrame(columns=columns)
for c in columns:
    ret[c] = data['%d_%s' % (int(c[1]), c[0])]
for c in others:
    ret[c] = data['%s' % c]
ret.rename(columns={'total': 'total_indices'}, inplace=True)

print("Before:")
print(data)
print("")
print("After:")
print(ret)

申し訳ありません...


1
columns=[('0', 'n'), ('0', 'p'), ('0', 'e'), ('1', 'n'), ('1', 'p'), ('1', 'e')]

df.columns = pd.MultiIndex.from_tuples(columns)

これは、既存のデータフレームを変換することはありません。
Stephen Rauch

@StephenRauch既存のデータフレームにマルチレベルの列を追加します。それはあなたが欲しいものではないですか?
Leopold

問題は、既存のデータフレームの変換についてでした。
スティーブンラウフ

はい、df.columnsのdfは既存のデータフレームです。それを試してみてください。
Leopold

えーと、パンダに詳しいので、試す必要はありません。あなたのコードはハードコードされたソリューションです。それは作るNO既存のデータフレームを見しようとしません。列名が異なる場合、コードは機能しません。
Stephen Rauch

0

OPの特定の列形式を取得するには、ビクターの並べ替えを調整する必要がありました。

df = df.sort_index(level=0, axis=1)

0 1 e n p e n p 0 -0.995452 -3.237846 1.298927 -0.269253 -0.857724 -0.461103


-2

より簡単な解決策があります:

  data.columns = data.columns.str.split('_', expand=True)

列名を配置するには、次のこともできます。

 data.sort_index(axis=1, inplace=True)

列レベルを変更するには:

 data = data.reorder_levels([1,0], axis=1)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.