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)
### 代码说明:
-
筛选表一:筛选出表一中类型为“责任碰撞”的数据。
-
匹配表一和表二:
-
根据表一的“数据片段”列和表二的“数据片段名称”列进行匹配。
-
将表一中的“事件详情”合并到表二中。
-
-
提取时间戳:
-
从“事件详情”中提取时间戳(假设时间戳格式为
YYYY-MM-DD HH:MM:SS
)。 -
时间戳位于“碰撞发生时间:”后面。
-
清理时间戳字符串:
-
使用
strip()
方法去除时间戳字符串前后的空格。 -
确保时间戳格式是干净的。
-
-
使用
errors='coerce'
:-
在
pd.to_datetime()
中使用errors='coerce'
参数,将无效的时间戳转换为NaT
,而不是抛出错误。
-
-
检查时间戳格式:
-
确保提取的时间戳格式是
YYYY-MM-DD HH:MM:SS
。
-
-
-
比对时间戳和标准值:
-
如果事件时间戳大于标准值,则将“结果确认”列更新为
fail
。
-
-
清理临时列:
-
删除临时添加的“事件时间戳”和“数据片段”列。
-
### 示例输出:
假设输入数据如下:
- 表一:
类型 数据片段 事件详情
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,其他信息...
### 注意事项:
-
时间戳格式:代码假设时间戳格式为
YYYY-MM-DD HH:MM:SS
,如果格式不同,需要调整提取逻辑。 -
缺失值处理:如果表二中的数据片段在表一中没有匹配到,
事件详情
列会显示为NaN
,代码会跳过这些行。 -
性能优化:如果数据量较大,可以考虑使用更高效的时间戳提取方法或并行处理。