gpt4 book ai didi

python - 根据 ID 状态转换数据帧

转载 作者:行者123 更新时间:2023-12-04 10:26:46 25 4
gpt4 key购买 nike

我有以下数据框

    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

最后一件事我应该根据状态 ID 转换数据帧
    USER_ID ID
0 23026 2
1 23027 2
... ... ... ...
123 16546 2
124 16622 1

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

最佳答案

我认为可能的解决方案是使用 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

然后比较 1来自 DataFrame.eq 并测试是否至少有一个 True每行 DataFrame.any , 最后 map并转换为 DataFrame :
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

关于python - 根据 ID 状态转换数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60613649/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com