如何用Python将非规范日期事件数据集转为标准长格式?
问题整理
我有一个包含非格式化日期及对应事件的数据集,当前数据含空行,日期行与事件行交替,格式如下:
date event 0 giovedì, 18 novembre 2010 giovedì, 18 novembre 2010 1 2 MELA Mela Sciences FDA Panel MELA Mela Sciences FDA Panel 3 martedì, 7 dicembre 2010 martedì, 7 dicembre 2010 4 5 OREX Orexigen Therapeutics OREX Orexigen Therapeutics 6 7 SLXP SALIX PHARMACEUTICALS SLXP SALIX PHARMACEUTICALS 8 giovedì, 9 dicembre 2010 giovedì, 9 dicembre 2010
需要将其整理为每个事件对应所属日期的标准长格式。
我先尝试删除空行,使用以下代码但未解决问题:
nan_value = float("NaN") fda.replace("", nan_value, inplace=True) fda.dropna(subset = ["date"], inplace=True)
之后尝试通过迭代行判断是否为日期行,但不知道如何将下一个日期前的行作为事件关联到对应日期,代码如下:
days=['lunedì','martedì','mercoledì','giovedì','venerdì','sabato','domenica'] for index, row in fda.iterrows(): string = row['date'] if any(ext in string for ext in days): eventdate = row['date'] event= ????
寻求解决方法。
解决方案
步骤1:预处理数据,标记日期行与事件行
先清理空行,再给每行标记属性:
import pandas as pd # 清理全空的行 fda = fda.replace("", pd.NA).dropna(how="all") # 定义意大利语星期列表 days = ['lunedì','martedì','mercoledì','giovedì','venerdì','sabato','domenica'] # 标记日期行:date列包含星期词的即为日期行 fda['is_date'] = fda['date'].str.contains('|'.join(days), na=False)
步骤2:填充日期并提取事件行
利用向前填充方法,把最近的日期关联到后续事件行:
# 向前填充日期,让每个事件行获取最近的日期 fda['event_date'] = fda[fda['is_date']]['date'].ffill() # 筛选出事件行(排除日期行本身),并重命名列 result = fda[~fda['is_date']].rename(columns={'date': 'event'}).reset_index(drop=True) # 保留最终需要的列 result = result[['event_date', 'event']]
最终效果
处理后的数据会呈现标准长格式:
event_date event 0 giovedì, 18 novembre 2010 MELA Mela Sciences FDA Panel 1 martedì, 7 dicembre 2010 OREX Orexigen Therapeutics 2 martedì, 7 dicembre 2010 SLXP SALIX PHARMACEUTICALS
核心逻辑:
- 先清理空行避免干扰
- 通过字符串匹配标记日期行,再用
ffill()实现日期的向下关联 - 最后筛选事件行,整理成目标结构
内容的提问来源于stack exchange,提问作者Gloria Dalla Costa
相关产品推荐
相关产品推荐

