网络分析中如何用前一时间戳的Target值填充Source列?
当然可以实现!
这个需求在时序数据处理里非常常见,本质就是按ID分组后,把当前行的Source字段填充为同组内上一行的Target值,用Python的Pandas库就能轻松搞定,下面是具体的实现步骤和代码:
核心思路
- 先确保数据按
ID和时间严格排序(这是取"前一个时间戳"值的关键,顺序错了结果就会出错) - 按
ID分组,对Target列使用shift()方法,将值向下偏移一行,得到的结果就是对应行的Source值 - 每组的第一行因为没有上一行数据,会自动保留
NA,正好匹配你的需求
具体代码实现
import pandas as pd # 模拟你的原始表格数据 data = { 'ID': [650, 650, 650], 'Date': ['18/07/2019', '19/07/2019', '27/07/2019'], 'Year': [2019, 2019, 2019], 'Month': ['Jul', 'Jul', 'Jul'], 'Day': [18, 19, 27], 'Time': ['21:32', '23:47', '19:24'], 'Target': ['Caledonia', 'Digby', 'Caledonia'], 'Source': ['NA', 'NA', 'NA'] } df = pd.DataFrame(data) # 第一步:合并日期和时间为完整时间戳,转换为datetime类型确保排序准确 df['Timestamp'] = pd.to_datetime(df['Date'] + ' ' + df['Time'], format='%d/%m/%Y %H:%M') # 第二步:按ID和时间戳排序,保证同ID下的行是按时间先后排列的 df = df.sort_values(by=['ID', 'Timestamp']) # 第三步:按ID分组,将Target列下移一行赋值给Source df['Source'] = df.groupby('ID')['Target'].shift(1) # 可选:把Pandas自动生成的NaN替换成你示例里的'NA'格式 df['Source'] = df['Source'].fillna('NA') # 输出你需要的列 print(df[['ID', 'Date', 'Year', 'Month', 'Day', 'Time', 'Target', 'Source']])
代码细节解释
pd.to_datetime(...):把分散的日期和时间字段合并成完整时间戳,确保排序是严格按时间先后的(如果你的原始数据已经是有序的,这一步可以简化,但建议保留以避免潜在的顺序问题)sort_values(by=['ID', 'Timestamp']):保证同一个ID下的记录是按时间顺序排列的,这是取"前一个时间戳"值的核心前提groupby('ID')['Target'].shift(1):对每个ID单独分组处理,把Target列的所有值向下移动一行,这样当前行的Source就等于上一行的Target;分组操作确保不会把不同ID的位置数据混在一起fillna('NA'):把Pandas自动生成的空值NaN替换成你示例里的NA文本格式
运行这段代码后,你就能得到和期望完全一致的结果啦!
内容的提问来源于stack exchange,提问作者Courtney lR
相关产品推荐
相关产品推荐

