使用 pandas 计算上一行字符串中的更改

Count changes in a string from the previous row using pandas

我有一个如下所示的数据框 df: Data

Id    Input
1     A,B
2     B,C,D
3     E,F,G
4     G

我想统计列表中的变化,所以我们也将在列表内进行比较,并与之前的ID列表进行比较,我的输出应该是这样的: Output

 Id    Input     Output
 1     A,B        1
 2     B,C,D      2
 3     E,F,G      3
 4     G          0

(A,B) 从 A 到 B 有 1 次变化。 (B,C,D) B 已经作为前一个 id 中的最后一个元素存在,因此从 B 到 c 和 c 到 D 将有 2 个变化。 (E,F,G) 由于 E 不是先前列表的最后一个元素,因此从先前的 D 到当前的 E、E 到 F 和 F 到 G 将发生三个变化。 对于 Id 4,将有 0 个更改,因为 G 也出现在最后一个列表中。

我如何创建一个计算这些变化的输出列。

在我看来,您只是要求补充。另外,您的第一个案例似乎很奇怪,从空列表到包含 2 个项目的列表似乎需要添加 2 个。

您所要做的就是存储每个列表中项目的哈希图。当你浏览下一个列表时,你可以在每个项目的 O(1) 时间内检查它是否已经存在。

这是一种方法。 假设数据帧索引是 "Id",你可以使用 DataFrame.shiftDataFrame.iterrows() 的组合来完成这个,首先你创建一个列,其中的值移动一个,然后输出列:

df['Input-1'] = df['Input'].shift(1).fillna('A' )
df['Output'] = 0

这将导致:

    Input Input-1  Output
Id
1     A,B       A       0
2   B,C,D     A,B       0
3   E,F,G   B,C,D       0
4       G   E,F,G       0

然后您可以遍历行并设置输出:

for id_, row in df.iterrows():
   df.at[id_, 'Output'] = len(set(row['Input-1'].split(',')[-1:]+row['Input'].split(',')))-1

输出将是:

    Input Input-1  Output
Id
1     A,B       A       1
2   B,C,D     A,B       2
3   E,F,G   B,C,D       3
4       G   E,F,G       0