如何使用Pandas将结构垂直转换为水平

时间:2019-04-25 09:23:24

标签: pandas

我想将以下Dataframe的结构更改为next。

| id | name | country | sort |
| 1 | Foo | USA | 1 |
| 1 | Foo | Japan | 2 |
| 1 | Foo | China | 3 |
| 2 | Bar | USA | 1 |
| 2 | Bar | UK | 3 |
| 2 | Bar | France | 4 |
| 3 | Zap | Japan | 2 |
| 3 | Zap | UK | 3 |
| 3 | Zap | Russia | 5 |

将垂直转换为水平。

| id | name | country01 | country02 | country03 |
| 1 | Foo | USA | Japan | China |
| 2 | Bar | USA | UK | France |
| 3 | Zap | Japan | UK | Russia |

我正在尝试使用pd.pivot_table。 但是,这似乎不适合此过程。

有什么主意吗?

其他信息

| id | name | country01 | sort01 | country02 | sort02 | country03 | sort03 |
| 1 | Foo | USA | 1 | Japan | 2 | China | 3 |
| 2 | Bar | USA | 1| UK | 3 | France | 4 |
| 3 | Zap | Japan | 2 | UK | 3 | Russia | 5 |

1 个答案:

答案 0 :(得分:1)

使用GroupBy.cumcount进行计数,然后用DataFrame.set_index,最后Series.unstackDataFrame.add_prefix进行整形:

df1 = (df.set_index(['id','name', 
                    df.groupby(['id','name']).cumcount().add(1)])['country']
        .unstack()
        .add_prefix('country')
        .reset_index())
print (df1)
   id name country1 country2 country3
0   1  Foo      USA    Japan    China
1   2  Bar      USA       UK   France
2   3  Zap    Japan       UK   Russia

编辑:您可以创建MultiIndex,按第二级排序并在列表理解中展平:

df1 = (df.set_index(['id','name', 
                    df.groupby(['id','name']).cumcount().add(1)])
        .unstack()
        .sort_index(axis=1, level=1))
df1.columns = [f'{a}{b}' for a, b in df1.columns]
df1 = df1.reset_index()
print (df1)
   id name country1  sort1 country2  sort2 country3  sort3
0   1  Foo      USA      1    Japan      2    China      3
1   2  Bar      USA      1       UK      3   France      4
2   3  Zap    Japan      2       UK      3   Russia      5