繁体   English   中英

Pandas - 识别非唯一行,对除特殊情况外的任何对进行分组

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM