本文旨在提供一种高效的解决方案,利用 pandas 库为 DataFrame 数据行分配唯一 ID。该方案基于日期、名称、产品等多列组合,并结合时间间隔的条件判断,实现灵活的ID生成逻辑,适用于需要对数据进行分组和识别的场景。
在数据处理过程中,为 DataFrame 中的数据行分配唯一的 ID 是一项常见的任务。尤其是在需要根据多个列的组合以及时间间隔来动态生成 ID 时,更需要巧妙地利用 Pandas 库的功能。本文将介绍一种基于 Pandas 的方法,通过组合使用 ne (not equal)、shift、assign、any 和 cumsum 等函数,实现根据日期、名称、产品以及时间间隔(Elapsed_time)为 DataFrame 分配唯一 ID 的需求。
解决方案
假设我们有一个 DataFrame,包含 date(日期)、Name(名称)、Product(产品)和 Elapsed_time(经过时间)等列。我们的目标是为每一行分配一个唯一的 ID,规则如下:
- 当 Date、Name 和 Product 的组合发生变化时,ID 递增。
- 在相同的 Date、Name 和 Product 组合内,如果 Elapsed_time 大于或等于 100 秒,则 ID 再次递增,并且后续行的 ID 保持递增后的值,直到 Date、Name 或 Product 发生变化。
以下代码展示了如何使用 Pandas 实现这一逻辑:
import pandas as pd # 示例 DataFrame data = {'Date': ['10/25/23', '10/25/23', '10/25/23', '10/25/23', '10/25/23', '10/25/23', '10/26/23', '10/27/23', '10/27/23', '10/27/23', '10/27/23', '10/27/23', '10/27/23', '10/27/23'], 'Name': ['Bill', 'Bill', 'John', 'John', 'John', 'John', 'John', 'Carl', 'Carl', 'Carl', 'Carl', 'Carl', 'Carl', 'Carl'], 'Product': ['A', 'A', 'B', 'B', 'B', 'B', 'C', 'A', 'A', 'A', 'A', 'B', 'A', 'A'], 'Elapsed_time': [30, 99, 10, 100, 1, 15, 45, 120, 99, 80, 101, 300, 12, 37]} df = pd.DataFrame(data) cols = ['Date', 'Name', 'Product'] df['id'] = (df[cols].ne(df[cols].shift()) .assign(x=df['Elapsed_time'].ge(100)) .any(axis=1).cumsum() ) print(df)
代码解释:
- cols = [‘Date’, ‘Name’, ‘Product’]: 定义一个列表,包含用于分组的列名。
- df[cols].ne(df[cols].shift()): 将当前行的 Date、Name 和 Product 与上一行进行比较,如果任何一个值不同,则返回 True,否则返回 False。 shift() 函数用于将 DataFrame 的列向下移动一行,方便进行比较。
- .assign(x=df[‘Elapsed_time’].ge(100)): 创建一个新的布尔列 x,如果 Elapsed_time 大于或等于 100,则该列的值为 True,否则为 False。
- .any(axis=1): 对每一行,判断 Date、Name、Product 的变化以及 Elapsed_time 是否大于等于 100,只要其中一个条件为 True,则该行的结果为 True。 axis=1 表示按行进行判断。
- .cumsum(): 对 any(axis=1) 的结果进行累加求和。由于 True 被视为 1,False 被视为 0,因此 cumsum() 的结果就是 ID。
输出结果:
Date Name Product Elapsed_time id 0 10/25/23 Bill A 30 1 1 10/25/23 Bill A 99 1 2 10/25/23 John B 10 2 3 10/25/23 John B 100 3 4 10/25/23 John B 1 3 5 10/25/23 John B 15 3 6 10/26/23 John C 45 4 7 10/27/23 Carl A 120 5 8 10/27/23 Carl A 99 5 9 10/27/23 Carl A 80 5 10 10/27/23 Carl A 101 6 11 10/27/23 Carl B 300 7 12 10/27/23 Carl A 12 8 13 10/27/23 Carl A 37 8
总结
通过巧妙地组合 Pandas 的各种函数,我们可以高效地实现复杂的 ID 生成逻辑。 这种方法不仅简洁易懂,而且性能良好,适用于处理大型数据集。 在实际应用中,可以根据具体需求调整代码,例如修改分组的列名或调整时间间隔的阈值。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END