Pandas处理DataFrame:合并重复行与计算时间差需求
DataFrame数据合并与时间差计算解决方案
完整代码实现
import pandas as pd from datetime import datetime # 构建原始DataFrame(对应提供的原始数据) data = { 'Date': ['2023-09-28 10:30', '2023-09-28 11:00', '2023-09-28 11:30', '2023-09-28 12:00', '2023-09-28 12:30', '2023-09-28 13:00', '2023-09-28 13:30', '2023-09-28 14:00', '2023-09-28 14:30', '2023-09-28 15:00', '2023-09-28 13:30', '2023-09-28 16:00', '2023-09-28 14:30', '2023-09-28 16:00', '2023-09-28 16:30'], 'price': [5,7,3,4,2,7,5,7,5,7,5,1,6,1,5], 'client': [5,7,1,3,8,4,6,4,6,4,6,3,1,3,6], 'Count': [3,9,10,15,1,8,9,8,9,8,9,12,11,12,9], 'test': ['0','L','GG','GG','L','GG','GG','GG','GG','GG','GG','L','L','L','GG'], 'flag': ['','','X','A','','X','X','X','X','X','A','X','X','A',''] } df = pd.DataFrame(data) # 合并X标记行到对应A标记行 # 计算每个test分组下X行的client和Count总和 x_group_sum = df[df['flag'] == 'X'].groupby('test')[['client', 'Count']].sum().reset_index() # 筛选出非X行(包含A标记行和无标记行) df_filtered = df[df['flag'] != 'X'].copy() # 将X行的总和合并到对应test分组的A行 df_filtered = df_filtered.merge(x_group_sum, on='test', how='left', suffixes=('', '_x_sum')) df_filtered['client'] = df_filtered.apply( lambda row: row['client'] + (row['client_x_sum'] if row['flag'] == 'A' else 0), axis=1 ) df_filtered['Count'] = df_filtered.apply( lambda row: row['Count'] + (row['Count_x_sum'] if row['flag'] == 'A' else 0), axis=1 ) df_filtered.drop(['client_x_sum', 'Count_x_sum'], axis=1, inplace=True) # 计算时间差并生成time列 # 转换Date列为datetime类型 df_filtered['Date'] = pd.to_datetime(df_filtered['Date']) # 按时间顺序排序 df_filtered = df_filtered.sort_values('Date').reset_index(drop=True) # 计算当前行到下一行的时间差(分钟) df_filtered['time_diff'] = df_filtered['Date'].shift(-1) - df_filtered['Date'] df_filtered['time_diff_min'] = df_filtered['time_diff'].dt.total_seconds() / 60 # 格式化时间差为要求的格式 df_filtered['time'] = df_filtered['time_diff_min'].apply( lambda x: '30minut' if x == 30 else '1H' if x == 60 else '' ) # 整理成期望的输出格式 result = df_filtered[['Date', 'price', 'client', 'Count', 'test', 'time']] result['Date'] = result['Date'].dt.strftime('%Y-%m-%d %H:%M') # 打印结果 print(result.to_string(index=False))
步骤说明
1. 合并X行到A行
- 按
test分组,计算所有X标记行的client和Count总和 - 筛选出非X行,将分组求和结果合并到对应test分组的A标记行,对
client和Count进行累加 - 删除临时计算列,得到合并后的基础数据集
2. 时间差计算与格式化
- 将
Date列转换为datetime类型,确保时间计算准确 - 按时间顺序排序数据集(原始数据存在时间乱序情况)
- 计算当前行到下一行的时间差,转换为分钟单位
- 将30分钟格式化为
30minut,60分钟格式化为1H,生成time列 - 整理列顺序并格式化
Date为字符串,得到最终结果
内容的提问来源于stack exchange,提问作者Ben Davidsson
相关产品推荐
相关产品推荐

