python-数据处理

python处理两张表
表一包含列名类型、数据片段、事件详情等列,表二包含标准值、数据片段名称、结果确认等列(没有事件详情列)
首先筛选表一类型=责任碰撞并且根据表一的数据片段去匹配表二的数据片段名称 如果匹配到了 将表一中对应的事件详情数据新增到表二中,然后对表二中的事件详情和标准值列进行比对  比对方法为 事件详情中的时间戳(该时间戳被包含在事件详情的值中,在"碰撞发生时间:" 的后面)和标准值列比对 若事件详情的值大于标准值列中的值 将对应的结果确认的值改为fail

import pandas as pd
import re

# 假设表一和表二已经加载为 DataFrame
# 表一
df1 = pd.DataFrame({
    '类型': ['责任碰撞', '其他类型', '责任碰撞'],
    '数据片段': ['A001', 'A002', 'A003'],
    '事件详情': [
        '【有责任碰撞】判定与真值标注物体发生有责任碰撞,碰撞发生时间:1714013500.857107,真值物体od0m坐标:(15,368475,-223.926314),(154.028964,-23.739413),(153.735425.-224.209075)',
        '其他事件详情...',
        '【有责任碰撞】判定与真值标注物体发生有责任碰撞,碰撞发生时间:1714013501.857108,真值物体odom坐标:(15,368475,-223.926314),(154.028964,-23.739413),(153.735425.-224.209075)'
    ]
})

# 表二
df2 = pd.DataFrame({
    '标准值': ['1714013500.857106', '1714013500.857107'],  # 标准值为字符串格式的浮点数
    '数据片段名称': ['A001', 'A003'],
    '结果确认': ['pass', 'pass']  # 初始结果确认列
})

# 1. 筛选表一中类型为“责任碰撞”的数据
df1_filtered = df1[df1['类型'] == '责任碰撞']

# 2. 根据数据片段匹配表一和表二,并将事件详情添加到表二中
df2 = df2.merge(df1_filtered[['数据片段', '事件详情']], 
                left_on='数据片段名称', right_on='数据片段', how='left')

# 3. 定义一个函数来提取事件详情中的时间戳
def extract_timestamp(event_detail):
    if pd.isna(event_detail):
        return None
    # 使用正则表达式查找带小数点的时间戳
    match = re.search(r'碰撞发生时间:(\d+\.\d+)', event_detail)
    return match.group(1) if match else None

# 4. 提取事件详情中的时间戳
df2['事件时间戳'] = df2['事件详情'].apply(extract_timestamp)

# 5. 比对事件时间戳和标准值,更新结果确认列
df2['结果确认'] = df2.apply(
    lambda row: 'fail' if pd.notna(row['事件时间戳']) and
                           pd.notna(row['标准值']) and
                           float(row['事件时间戳']) > float(row['标准值']) else row['结果确认'],
    axis=1
)

# 6. 删除临时列(事件时间戳和数据片段)
df2.drop(columns=['事件时间戳', '数据片段'], inplace=True)

# 输出结果
print(df2)

### 代码说明:

  1. 筛选表一:筛选出表一中类型为“责任碰撞”的数据。

  2. 匹配表一和表二

    • 根据表一的“数据片段”列和表二的“数据片段名称”列进行匹配。

    • 将表一中的“事件详情”合并到表二中。

  3. 提取时间戳

    • 从“事件详情”中提取时间戳(假设时间戳格式为 YYYY-MM-DD HH:MM:SS)。

    • 时间戳位于“碰撞发生时间:”后面。

    • 清理时间戳字符串

      • 使用 strip() 方法去除时间戳字符串前后的空格。

      • 确保时间戳格式是干净的。

    • 使用 errors='coerce'

      • 在 pd.to_datetime() 中使用 errors='coerce' 参数,将无效的时间戳转换为 NaT,而不是抛出错误。

    • 检查时间戳格式

      • 确保提取的时间戳格式是 YYYY-MM-DD HH:MM:SS

  4. 比对时间戳和标准值

    • 如果事件时间戳大于标准值,则将“结果确认”列更新为 fail

  5. 清理临时列

    • 删除临时添加的“事件时间戳”和“数据片段”列。

### 示例输出:
假设输入数据如下:
- 表一:

      类型   数据片段                             事件详情
0  责任碰撞   A001  碰撞发生时间:2023-10-01 12:00:00,其他信息...
1  其他类型   A002                             其他事件详情...
2  责任碰撞   A003  碰撞发生时间:2023-09-30 15:30:00,其他信息...

- 表二:

            标准值    数据片段名称 结果确认
0  2023-10-01 10:00:00   A001    pass
1  2023-09-30 14:00:00   A003    pass

运行代码后,表二的结果为:

            标准值      数据片段 结果确认                             事件详情
0  2023-10-01 10:00:00   A001    fail  碰撞发生时间:2023-10-01 12:00:00,其他信息...
1  2023-09-30 14:00:00   A003    fail  碰撞发生时间:2023-09-30 15:30:00,其他信息...

### 注意事项:

  1. 时间戳格式:代码假设时间戳格式为 YYYY-MM-DD HH:MM:SS,如果格式不同,需要调整提取逻辑。

  2. 缺失值处理:如果表二中的数据片段在表一中没有匹配到,事件详情列会显示为 NaN,代码会跳过这些行。

  3. 性能优化:如果数据量较大,可以考虑使用更高效的时间戳提取方法或并行处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值