首页 > 解决方案 > 根据 ID 状态转换数据帧

问题描述

我有以下数据框

    USER_ID MONTH       STATUS_ID
0   23026   2019-09-01  2
1   23026   2019-10-01  2
2   23026   2019-11-01  2
3   23026   2019-12-01  2
4   23027   2019-09-01  2
... ... ... ...
123 16546   2018-10-01  2
124 16622   2018-09-01  1
125 16622   2018-10-01  1
126 16622   2018-11-01  1
127 16622   2018-12-01  1

所有用户都应该有 4 行(4 个月),但期间可以不同(01.02.2018 -01.05.2018 或 01.02.2019 - 01.05.2019 ...)

我想像这样转变

    USER_ID MONTH_1 MONTH_2 MONTH_3 MONTH_4
0   23026   2       2       2       2
1   23027   2       2       2       2
... ... ... ...
123 16546   2       2       1       1
124 16622   1       1       1       1

最后一件事我应该根据 STATUS ID 转换数据框

    USER_ID ID
0   23026   2    
1   23027   2    
... ... ... ...
123 16546   2
124 16622   1

这是不同月份 ID 之间的一种布尔运算。知道如何改变这个吗?还是可以更有效地解决这个问题?

标签: pythonpandasdataframe

解决方案


我认为可能的解决方案是通过计数创建新列GroupBy.cumcount并传递给DataFrame.pivot

print (df)
     USER_ID       MONTH  STATUS_ID
0      23026  2019-09-01          2
1      23026  2019-10-01          2
2      23026  2019-11-01          2
3      23026  2019-12-01          2
123    16546  2018-09-01          2
123    16546  2018-10-01          2
123    16546  2018-11-01          1
123    16546  2018-12-01          1
124    16622  2018-09-01          1
125    16622  2018-10-01          1
126    16622  2018-11-01          1
127    16622  2018-12-01          1

df['MONTH1'] = 'MONTH_' + df.groupby('USER_ID').cumcount().add(1).astype(str)
df = df.pivot('USER_ID','MONTH1','STATUS_ID')
print (df)
MONTH1   MONTH_1  MONTH_2  MONTH_3  MONTH_4
USER_ID                                    
16546          2        2        1        1
16622          1        1        1        1
23026          2        2        2        2

然后比较 by1并测试每行DataFrame.eq是否至少有一个by , last并转换为:TrueDataFrame.anymapDataFrame

df1 = df1.eq(1).any(axis=1).map({True:1, False:2}).reset_index(name='ID')
print (df1)
   USER_ID  ID
0    16546   1
1    16622   1
2    23026   2

详情

print (df1.eq(1))
MONTH1   MONTH_1  MONTH_2  MONTH_3  MONTH_4
USER_ID                                    
16546      False    False     True     True
16622       True     True     True     True
23026      False    False    False    False

推荐阅读