识别 Pandas 中的非连续行
Posted
技术标签:
【中文标题】识别 Pandas 中的非连续行【英文标题】:Identifying nonsequential rows in Pandas 【发布时间】:2021-09-10 20:52:51 【问题描述】:我有以下 excel 电子表格:
CODE | ID |
---|---|
ABC | 1 |
ABC | 2 |
BCD | 1 |
ABC | 4 |
CDE | 1 |
CDE | 2 |
BCD | 5 |
我需要识别并创建每个 CODE 的列表,其中有一个不直接遵循原始序列的 ID(在此示例中,ABC 由于 ABC4 和 BCD 由于 BCD5),无论它在表中的哪个位置谎言。初始 ID 将按顺序排列。当 CODE 被更新时(该表之外的某个地方),该表将生成一个新行,从而产生一个不连续的 ID 号。
这是我迄今为止所做的头脑风暴:
我创建了一个字典,并使用表中的每个 CODE 作为键,并使用每个 ID 的列表作为它的值。 创建某种 IF 语句来检查第一个值 + 1 是否等于第二个值。如果为 false,请将 CODE 保存在新列表中。就思维过程而言,我是否走在正确的轨道上?我仍在努力确定 If/Else、While 和 For 循环何时最合适。提前谢谢大家。
【问题讨论】:
您对该样本的预期结果是什么? 对于这个示例,我希望得到一个列表:ABC、BCD 【参考方案1】:让我们试试groupby
+ filter
,注意你用pandas
尽量不要使用for循环
out = df.groupby('CODE').filter(lambda x : x['ID'].diff().dropna().ne(1).any())['CODE'].unique()
Out[239]: array(['ABC', 'BCD'], dtype=object)
【讨论】:
你必须先.sort_values('ID')
groupby
这是一个很好的起点。根据您的建议,我得到的输出是所有 CODE 的列表,而不是那些具有非顺序 ID 的列表。我的表有其他列包含无关信息,这可能是导致问题的原因,但我会在最后深入研究它,看看我是否能弄清楚。非常感谢贝尼。【参考方案2】:
使用 groupby
和 agg
但确保您的数据框按 ID
列排序,否则 [FGH (1, 3, 2)] 之类的序列将匹配
out = df.loc[df.sort_values('ID').groupby('CODE')['ID'].agg('diff').gt(1),
'CODE'].tolist()
>>> out
['ABC', 'BCD']
【讨论】:
感谢您的反馈。这段代码看起来也很有希望,我正在尝试相应地调整它。看起来我遇到了我在回应 BENY 的回复时提到的同样的问题。这是一个巨大的帮助。非常感谢。以上是关于识别 Pandas 中的非连续行的主要内容,如果未能解决你的问题,请参考以下文章