Pandas: làm thế nào tôi có thể tạo các cột đa cấp


8

Tôi có một DataFrame gấu trúc có các cột sau:

n_0
n_1
p_0
p_1
e_0
e_1

Tôi muốn chuyển đổi nó để có cột và cột phụ:

0
    n
    p
    e
1
    n
    p
    e

Tôi đã tìm kiếm trong tài liệu này và tôi hoàn toàn không biết làm thế nào để thực hiện điều này. Có ai có bất cứ đề nghị?

Câu trả lời:


1

Cuối cùng, tôi tìm thấy một giải pháp.

Bạn có thể tìm thấy kịch bản ví dụ dưới đây.

#!/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)

Xin lỗi vì điều này...


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

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

Điều này không có gì để chuyển đổi khung dữ liệu hiện có.
Stephen Rauch

@StephenRauch Nó thêm các cột đa cấp vào khung dữ liệu hiện có. Đó không phải là những gì bạn muốn?
Leopold

Câu hỏi là về việc chuyển đổi một khung dữ liệu hiện có.
Stephen Rauch

Có, df trong df.columns là khung dữ liệu hiện có của bạn. Thử nó.
Leopold

Ừm, tôi không cần thử, vì tôi rất quen thuộc với gấu trúc. Mã của bạn là một giải pháp mã hóa cứng. Nó KHÔNG cố gắng nhìn vào khung dữ liệu hiện có. Nếu tên cột khác nhau, mã của bạn KHÔNG hoạt động.
Stephen Rauch

0

Tôi đã phải điều chỉnh sắp xếp của người chiến thắng để có được định dạng cột cụ thể của 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

Có một giải pháp đơn giản hơn:

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

Để sắp xếp tên cột người ta cũng có thể làm:

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

Để thay đổi cấp độ cột:

 data = data.reorder_levels([1,0], axis=1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.