[英]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.