使用 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.shift
和 DataFrame.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
我有一个如下所示的数据框 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.shift
和 DataFrame.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