【问题标题】:Pandas: Determine which rows are connected by a matching value in the nextPandas:确定下一个匹配值连接哪些行
【发布时间】:2021-12-06 15:27:23
【问题描述】:

我有一个这样的数据框:

      J1    J2    J3    J4
0     551    5    552   553
1     551   554    2     5
2      2    554   555   556
3      7     6    557   558
4     559    9    560   561

目标是确定哪些行相互连接。例如:第 0 行、第 1 行和第 2 行具有将其连接到下一行的匹配值(第 0 行和第 1 行中的 551,第 1 和第 2 行中的 554)。一旦确定,我需要将这些行隔离到它自己单独的数据块中。它应该适用于数据框中的任何行,不一定只适用于下一行。我无法完全弄清楚如何做到这一点。有什么想法吗?

【问题讨论】:

  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: python pandas dataframe matching


【解决方案1】:

由于您的数据集很小,您可以使用 numpy 广播来执行所有比较:

下面的代码给出了连接行的数量(我为示例添加了一个额外的连接行):

a = df.values

b = (a==a[:,None]).sum(2)
np.fill_diagonal(b, 0)

df['connected'] = b.sum(0)

输出:

     0    1    2    3  connected
0  551    5  552  553          1
1  551  554    2    5          3
2    2  554  555  556          1
3    7    6  557  558          0
4  559    9  560  561          0
5  500    0    2    0          1

【讨论】:

  • 我想我的问题是每一行实际上代表了一个有 4 个点的矩形。现在,想象许多单独的矩形,每个矩形都分成“n”个矩形。我需要将较小的矩形组合在一起,以形成单个大矩形(例如 150 个矩形,每个矩形切成 2/3 块或其他东西)。因此,输出应该是一块数据,其中包含每个整体的关节/点 ID。不确定这是否有意义,或者是否有可能。
【解决方案2】:

查找连接的连续行:

您可以使用shift+any与下一行进行比较:

mask = df.eq(df.shift(-1)).any(1)
df['connected'] = mask|mask.shift()

输出:

    J1   J2   J3   J4  connected
0  551    5  552  553       True
1  551  554    2    5       True
2    2  554  555  556       True
3    7    6  557  558      False
4  559    9  560  561      False

【讨论】:

  • 这是真的,但是如果向下 10 行,还有另一行包含值“551”。如何将该行连接到第 0、1 和 2 行并将其存储为单独的列表?我需要为发生这种情况的每个实例执行此操作。它应该在表中的任何行中搜索匹配值。
  • 你的真实数据集有多大?您想要做的事情需要比较行的所有组合,这很快就会变得困难。根据数据的大小,有不同的策略。
  • 数据集只是 [550 行 x 5 列]。所以没什么太激烈的。在这种情况下我不关心效率,因为这段代码基本上是1次使用的东西。
  • @largerod 我提供了另一个答案,如果这对你有用,请告诉我。
猜你喜欢
  • 1970-01-01
  • 2020-02-03
  • 2022-11-01
  • 2021-11-18
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多