对于以下数据框:
import pandas as pd
df=pd.DataFrame({'list_A':[3,3,3,3,3,\
2,2,2,2,2,2,2,4,4,4,4,4,4,4,4,4,4,4,4]})
如何操纵“list_A”以给出“list_B”?
所需的输出:
list_A | list_B | |
---|---|---|
0 | 3 | 1 |
1 | 3 | 1 |
2 | 3 | 1 |
3 | 3 | 0 |
4 | 2 | 1 |
5 | 2 | 1 |
6 | 2 | 0 |
7 | 2 | 0 |
8 | 4 | 1 |
9 | 4 | 1 |
10 | 4 | 1 |
11 | 4 | 1 |
12 | 4 | 0 |
13 | 4 | 0 |
14 | 4 | 0 |
15 | 4 | 0 |
16 | 4 | 0 |
如您所见,如果 List_A 的数字为 3 - 那么 List_B 的前 3 个值为“1”,然后 List_B 的值更改为“0”.....直到 List_A 再次更改值... ..
谢谢。
答案 0 :(得分:2)
GroupBy.cumcount
df['list_B'] = df['list_A'].gt(df.groupby('list_A').cumcount()).astype(int)
print(df)
输出
list_A list_B
0 3 1
1 3 1
2 3 1
3 3 0
4 3 0
5 2 1
6 2 1
7 2 0
8 2 0
9 2 0
10 2 0
11 2 0
12 4 1
13 4 1
14 4 1
15 4 1
16 4 0
17 4 0
18 4 0
19 4 0
20 4 0
21 4 0
22 4 0
23 4 0
编辑
blocks = df['list_A'].ne(df['list_A'].shift()).cumsum()
df['list_B'] = df['list_A'].gt(df.groupby(blocks).cumcount()).astype(int)