pandas - 数据框内的数据框 - 创建新列_
问题描述
对于以下数据框:
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”?
期望的输出:
列表_A | 列表_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 再次更改值......
谢谢你。
解决方案
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)
推荐阅读
- vue.js - Vue:表格行和axio上传中的多进度条
- mysql - 高 MySQL CPU 使用率 (300-400%)
- spring - @Scheduled + Hibernate -> LazyInitializationException
- python - Python 复杂查询
- r - 使用 csv 文件中的特定行在 R 编程中制作条形图
- ios - UICollectionView 内部不显示单元格
- python - Scipy resample 用于下采样,傅里叶方法解释
- ios - Scenekit 控制缓冲区清理的方法?
- c++ - QScrollArea:由垂直滚动条引起的水平滚动条
- docker - 如果容器立即退出,探索 Docker 的图像文件?