[英]Pandas - Identify non-unique rows, grouping any pairs except in particular case
这是对这个问题的延伸。
我试图找出一种非循环方式来识别(自动递增 int 将是理想的)每个 TDateID、GroupID 组合中的非唯一行组(一个组可以包含 1 行或更多行)。 除非所有行都具有 Structure =“s”,否则我需要它忽略该配对分组。
这是一个看起来像的示例 DataFrame
指数 | 美分 | 结构 | SD_YF | 日期ID | 组ID |
---|---|---|---|---|---|
10 | 182.5 | s | 2.1 | 0 | 0 |
11 | 182.5 | s | 2.1 | 0 | 0 |
12 | 153.5 | s | 1.05 | 0 | 1 |
13 | 153.5 | s | 1.05 | 0 | 1 |
14 | 43 | p | 11 | 1 | 2 |
15 | 43 | p | 11 | 1 | 2 |
4 | 152 | s | 21 | 1 | 2 |
5 | 152 | s | 21 | 1 | 2 |
21 | 53 | s | 13 | 2 | 3 |
22 | 53 | s | 13 | 2 | 3 |
24 | 252 | s | 25 | 2 | 3 |
25 | 252 | s | 25 | 2 | 3 |
以熊猫形式:
df = pd.DataFrame({'Index': [10, 11, 12, 13, 14, 15, 4, 5, 21, 22, 24, 25],
'Cents': [182.5,
182.5,
153.5,
153.5,
43.0,
43.0,
152.0,
152.0,
53.0,
53.0,
252.0,
252.0],
'Structure': ['s', 's', 's', 's', 'p', 'p', 's', 's', 's', 's', 's', 's'],
'SD_YF': [2.1,
2.1,
1.05,
1.05,
11.0,
11.0,
21.0,
21.0,
13.0,
13.0,
25.0,
25.0],
'TDateID': [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2],
'GroupID': [0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3]})
我理想的输出是:
指数 | 美分 | 结构 | SD_YF | 日期ID | 组ID | 统一标识 |
---|---|---|---|---|---|---|
10 | 182.5 | s | 2.1 | 0 | 0 | 1 |
11 | 182.5 | s | 2.1 | 0 | 0 | 2 |
12 | 153.5 | s | 1.05 | 0 | 1 | 3 |
13 | 153.5 | s | 1.05 | 0 | 1 | 4 |
14 | 43 | p | 11 | 1 | 2 | 5 |
15 | 43 | p | 11 | 1 | 2 | 6 |
4 | 152 | s | 21 | 1 | 2 | 5 |
5 | 152 | s | 21 | 1 | 2 | 6 |
21 | 53 | s | 13 | 2 | 3 | 7 |
22 | 53 | s | 13 | 2 | 3 | 8 |
24 | 252 | s | 25 | 2 | 3 | 9 |
25 | 252 | s | 25 | 2 | 3 | 10 |
我用粗体#5 来提请注意索引 14、4 是如何配对在一起的。 与#6 类似。 我希望这是有道理的!
使用以下代码效果很好,除了它需要适应“结构!=“s”用于分组中的所有行”部分。
df['UniID'] = (df['GroupID']
+df.groupby('GroupID').ngroup().add(1)
+df.groupby(['GroupID', 'Cents', 'SD_YF']).cumcount()
)
ID需要连续吗?
如果“重复”行的发生率很小,那么只循环这些组可能不会太糟糕。
首先使用您拥有的代码为所有对设置一个 ID(并添加一行属于组的指示符列)。 然后选择组中的所有行(使用指示符列)并遍历组。 如果该组具有所有 S,则重新分配 ID,使其对每一行都是唯一的。
棘手的是想象这应该如何概括。 这是我的理解:创建一个忽略p
的顺序计数,然后回填这些。
m = df['Structure'].eq('s')
df['UniID'] = m.cumsum()+(~m).cumsum().mask(m,0)
输出:
Index Cents Structure SD_YF TDateID GroupID UniID
0 10 182.5 s 2.10 0 0 1
1 11 182.5 s 2.10 0 0 2
2 12 153.5 s 1.05 0 1 3
3 13 153.5 s 1.05 0 1 4
4 14 43.0 p 11.00 1 2 5
5 15 43.0 p 11.00 1 2 6
6 4 152.0 s 21.00 1 2 5
7 5 152.0 s 21.00 1 2 6
8 21 53.0 s 13.00 2 3 7
9 22 53.0 s 13.00 2 3 8
10 24 252.0 s 25.00 2 3 9
11 25 252.0 s 25.00 2 3 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.