识别 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】:

使用 groupbyagg 但确保您的数据框按 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 中的非连续行的主要内容,如果未能解决你的问题,请参考以下文章

使用具有非连续行的函数 diff 进行聚合

Pandas 列对连续行执行最大/最小操作

pandas:将具有相同值的连续行分组为一组

使用 Groupby 识别 Pandas Dataframe 中的连续相同值

pandas从数据框中用连续的差异过滤行< n。

使用 Pandas 以更有效的方式在后续行之间应用函数