Tôi muốn chạy một trục xoay trên gấu trúc DataFrame
, với chỉ mục là hai cột, không phải một cột. Ví dụ: một trường cho năm, một trường cho tháng, trường 'item' hiển thị mục 'item 1' và 'item 2' và trường 'value' có giá trị bằng số. Tôi muốn chỉ số là năm + tháng.gấu trúc: làm thế nào để chạy một trục với nhiều chỉ mục?
Cách duy nhất tôi quản lý để làm việc này là kết hợp hai trường thành một, sau đó tách chúng lại. Có cách nào tốt hơn?
Mã tối thiểu được sao chép bên dưới. Cảm ơn rất nhiều!
PS Có, tôi biết có các câu hỏi khác với từ khóa 'pivot' và 'multi-index', nhưng tôi không hiểu liệu/làm thế nào chúng có thể giúp tôi với câu hỏi này.
import pandas as pd
import numpy as np
df= pd.DataFrame()
month = np.arange(1, 13)
values1 = np.random.randint(0, 100, 12)
values2 = np.random.randint(200, 300, 12)
df['month'] = np.hstack((month, month))
df['year'] = 2004
df['value'] = np.hstack((values1, values2))
df['item'] = np.hstack((np.repeat('item 1', 12), np.repeat('item 2', 12)))
# This doesn't work:
# ValueError: Wrong number of items passed 24, placement implies 2
# mypiv = df.pivot(['year', 'month'], 'item', 'value')
# This doesn't work, either:
# df.set_index(['year', 'month'], inplace=True)
# ValueError: cannot label index with a null key
# mypiv = df.pivot(columns='item', values='value')
# This below works but is not ideal:
# I have to first concatenate then separate the fields I need
df['new field'] = df['year'] * 100 + df['month']
mypiv = df.pivot('new field', 'item', 'value').reset_index()
mypiv['year'] = mypiv['new field'].apply(lambda x: int(x)/100)
mypiv['month'] = mypiv['new field'] % 100
Tôi đã cung cấp một số ví dụ chi tiết và cách tiếp cận thay thế trong [** Hỏi & Đáp **] này (https://stackoverflow.com/q/47152691/2336654) – piRSquared