簡體   English   中英

Pandas 多索引unstack到單行

[英]Pandas multi-index unstack to single row

我對簡單的 Pandas 非常滿意,但在數據重塑和多索引方面遇到了困難。 我有一個看起來像這樣的多索引 dataframe(它不一定是多索引,但它似乎是正確的做法)

姓名 指數 f1 f2 f3 計算1 計算2 計算3
狐狸 1 紅色的 白色的 毛皮 0.21 1.67 -0.34
2 0.76 2.20 -1.02
3 0.01 1.12 -0.22
1 白色的 黃色 羽毛 0.04 1.18 -2.01
2 0.18 0.73 -1.21
糧食 1 黃色 玉米 0.89 1.65 -1.03
2 0.34 2.45 -0.45
3 0.87 1.11 -0.97

我想要的是:

姓名 f1 f2 f3 calc1_1 calc2_1 calc3_1 calc1_2 calc2_2 calc3_2 calc1_3 calc2_3 calc3_3
狐狸 紅色的 白色的 毛皮 0.21 1.67 -0.34 0.76 2.20 -1.02 0.01 1.12 -0.22
白色的 黃色 羽毛 0.04 1.18 -2.01 0.18 0.73 -1.21
糧食 黃色 玉米 0.89 1.65 -1.03 0.34 2.45 -0.45 0.87 1.11 -0.97

我認為這對於 pandas 大師來說一定很容易。 感謝你的幫助!!

德魯

嘗試set_index + unstack重塑為長格式

new_df = df.set_index(['name', 'index', 'f1', 'f2', 'f3']).unstack('index')

或通過pivot

new_df = df.pivot(index=['name', 'f1', 'f2', 'f3'], columns='index')

使用 sort_index 對sort_index進行排序:

new_df = new_df.sort_index(axis=1, level=1)

然后通過map + reset_index

new_df.columns = new_df.columns.map(lambda s: '_'.join(map(str, s)))

new_df = new_df.reset_index()

new_df

      name      f1      f2        f3  calc1_1  calc2_1  calc3_1  calc1_2  calc2_2  calc3_2  calc1_3  calc2_3  calc3_3
0  chicken   white  yellow  feathers     0.04     1.18    -2.01     0.18     0.73    -1.21      NaN      NaN      NaN
1      fox     red   white       fur     0.21     1.67    -0.34     0.76     2.20    -1.02     0.01     1.12    -0.22
2    grain  yellow     bag      corn     0.89     1.65    -1.03     0.34     2.45    -0.45     0.87     1.11    -0.97

完整代碼:

import pandas as pd

df = pd.DataFrame({
    'name': ['fox', 'fox', 'fox', 'chicken', 'chicken', 'grain', 'grain',
             'grain'],
    'index': [1, 2, 3, 1, 2, 1, 2, 3],
    'f1': ['red', 'red', 'red', 'white', 'white', 'yellow', 'yellow', 'yellow'],
    'f2': ['white', 'white', 'white', 'yellow', 'yellow', 'bag', 'bag', 'bag'],
    'f3': ['fur', 'fur', 'fur', 'feathers', 'feathers', 'corn', 'corn', 'corn'],
    'calc1': [0.21, 0.76, 0.01, 0.04, 0.18, 0.89, 0.34, 0.87],
    'calc2': [1.67, 2.2, 1.12, 1.18, 0.73, 1.65, 2.45, 1.11],
    'calc3': [-0.34, -1.02, -0.22, -2.01, -1.21, -1.03, -0.45, -0.97]
})

new_df = (
    df.set_index(['name', 'index', 'f1', 'f2', 'f3'])
        .unstack('index')
        .sort_index(axis=1, level=1)
)

new_df.columns = new_df.columns.map(lambda s: '_'.join(map(str, s)))

new_df = new_df.reset_index()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM