简体   繁体   English

如何部分 pivot pandas 中的表

[英]How to partially pivot a table in pandas

I'm not sure if "pivot" is the right term for this, but I have something like我不确定“pivot”是否是正确的术语,但我有类似的东西

ID ID type类型 date日期
123 123 A一个 1-2-2020 2020 年 1 月 2 日
123 123 B 1-7-2020 2020 年 1 月 7 日
123 123 C C 1-14-2020 2020 年 1 月 14 日
456 456 A一个 5-18-2019 5-18-2019
456 456 B 5-30-2019 2019 年 5 月 30 日
789 789 A一个 8-7-2021 2021 年 8 月 7 日
789 789 B 8-16-2021 2021 年 8 月 16 日
789 789 C C 8-23-2021 2021 年 8 月 23 日
789 789 D D 8-30-2021 2021 年 8 月 30 日

And I want to transform it into something like:我想把它变成这样的东西:

ID ID type_1 type_1 date_1日期_1 type_2类型_2 date_2日期_2
123 123 A一个 1-2-2020 2020 年 1 月 2 日 B 1-7-2020 2020 年 1 月 7 日
123 123 B 1-7-2020 2020 年 1 月 7 日 C C 1-14-2020 2020 年 1 月 14 日
456 456 A一个 5-18-2019 5-18-2019 B 5-30-2019 2019 年 5 月 30 日
789 789 A一个 8-7-2021 2021 年 8 月 7 日 B 8-16-2021 2021 年 8 月 16 日
789 789 B 8-16-2021 2021 年 8 月 16 日 C C 8-23-2021 2021 年 8 月 23 日
789 789 C C 8-23-2021 2021 年 8 月 23 日 D D 8-30-2021 2021 年 8 月 30 日

So that they types are paired and every row has exactly two types and dates.这样它们的类型是成对的,并且每一行都有两种类型和日期。

Try this:尝试这个:

new_df = pd.concat([
    df.groupby('ID').apply(lambda g: g.head(g.shape[0] - 1)).reset_index(drop=True),
    df.groupby('ID').apply(lambda g: g.tail(g.shape[0] - 1)).reset_index(drop=True).drop('ID', axis=1)
], axis=1)

Output: Output:

>>> new_df
    ID type       date type       date
0  123    A   1-2-2020    B   1-7-2020
1  123    B   1-7-2020    C  1-14-2020
2  456    A  5-18-2019    B  5-30-2019
3  789    A   8-7-2021    B  8-16-2021
4  789    B  8-16-2021    C  8-23-2021
5  789    C  8-23-2021    D  8-30-2021

More compact version:更紧凑的版本:

new_df = pd.concat([df.groupby('ID').apply(lambda g:g.head(g.shape[0]-1)).reset_index(drop=True),df.groupby('ID').apply(lambda g:g.tail(g.shape[0]-1)).reset_index(drop=True).drop('ID', axis=1)],axis=1)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM