[英]"Group" rows based on one column, then create new columns for the possible combinations of existing other columns' values
我有以下形式的數據框:
日期 | I1 | I2 | F1 | F2 |
---|---|---|---|---|
1 | 1 | 一種 | v1 | v9 |
1 | 1 | 乙 | v2 | v10 |
1 | 10 | 一種 | v3 | v11 |
1 | 10 | 乙 | v4 | v12 |
2 | 1 | 一種 | v5 | v13 |
2 | 1 | 乙 | v6 | v14 |
2 | 10 | 一種 | v7 | v15 |
2 | 10 | 乙 | v8 | v16 |
我想根據來自“I1”和“I2”的值的可能組合創建新列,並將相應的值全部放在一行中(對於同一日期)。 生成的數據框應如下所示(最多列的順序,這無關緊要,我只是出於可視化目的選擇了一個):
日期 | F1-1-A | F1-1-B | F1-10-A | F1-10-B | F2-1-A | F2-1-B | F2-10-A | F2-10-B |
---|---|---|---|---|---|---|---|---|
1 | v1 | v2 | v3 | v4 | v9 | v10 | v11 | v12 |
2 | v5 | v6 | v7 | v8 | v13 | v14 | v15 | v16 |
在熊貓中實現這一目標的最簡潔和通用的方法是什么?
你正在尋找一個支點。 執行此操作后,您將需要加入多索引列名稱以使其變平。
df = df.pivot(index='date',columns=['I1','I2'], values=['F1','F2'])
df.columns = ['-'.join(map(str,x)) for x in df.columns]
df.reset_index(inplace=True)
輸出
date F1-1-A F1-1-B F1-10-A F1-10-B F2-1-A F2-1-B F2-10-A F2-10-B
0 1 v1 v2 v3 v4 v9 v10 v11 v12
1 2 v5 v6 v7 v8 v13 v14 v15 v16
@Chris 的解決方案效果很好; pivot_wider
的pyjanitor
可以進行pivot_wider
抽象,以展pyjanitor
(或在需要時進行一些其他操作):
#pip install git+https://github.com/pyjanitor-devs/pyjanitor.git
import pandas as pd
import janitor
df.pivot_wider(index='date', names_from=['I1', 'I2'], names_sep='-')
date F1-1-A F1-1-B F1-10-A F1-10-B F2-1-A F2-1-B F2-10-A F2-10-B
0 1 v1 v2 v3 v4 v9 v10 v11 v12
1 2 v5 v6 v7 v8 v13 v14 v15 v16
請注意,僅當索引和列的組合是唯一的時,pivot 才起作用; 如果不是,更好的選擇是pivot_table
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.