根据需要将 python 数据框更改为枢轴

Changing python data-frame to pivot as per need

我有一个如下所示的数据框:

ID1 ID2 YrMonth Class
1   p1  Feb-19  PE5
1   p1  Feb-19  PE5
1   p1  Feb-19  PE5
1   p1  Feb-19  SC

1   p2  Feb-19  SC
1   p2  Feb-19  SC
1   p2  Feb-19  SC

1   p3  Feb-19  EA
1   p3  Feb-19  EA
1   p3  Feb-19  PE5

1   p4  Feb-19  EA
1   p4  Feb-19  PE5
1   p4  Feb-19  SC

我想将它转换成另一个数据框或数据透视表,这样在给定的月份对于特定的 ID2,如果 class 中有转换,它应该反映在输出中给定的行中 table。 对于 ex - 在 ID2 中,p1 class 从 PE5 更改为 SC。在输出中我表示为 PE5->SC 但它也可以是其他方便的表示。

如果特定 ID2 的 class 没有变化,class 应该出现在第二行输出中 table class 仅是 SC .

对于 ID2 p3,在 class 中存在从 EA 到 PE5 的转换,因此它表示为 EA->PE5。

对于 ID2 p4,在 class 中存在从 EA-PE5-SC 的转换,因此它表示为 EA->PE5->SC

输出pivot/dataframe

ID1    ID2  YrMonth  Class                   
1      p1   Feb-19   PE5->SC
1      p2   Feb-19   SC
1      p3   Feb-19   EA->PE5
1      p4   Feb-19   EA->PE5->SC

使用 DataFrame.drop_duplicates 和聚合 join:

df1 = (df.drop_duplicates()
         .groupby(['ID1','ID2','YrMonth'])['Class']
         .agg('->'.join).reset_index())
print (df1)
   ID1 ID2 YrMonth        Class
0    1  p1  Feb-19      PE5->SC
1    1  p2  Feb-19           SC
2    1  p3  Feb-19      EA->PE5
3    1  p4  Feb-19  EA->PE5->SC

如果需要指定列来删除重复项:

df1 = (df.drop_duplicates(['ID1','ID2','YrMonth','Class'])
         .groupby(['ID1','ID2','YrMonth'])['Class']
         .agg('->'.join).reset_index())
print (df1)