如何在Pandas方法链中通过.assign()调用pd.to_datetime()?
解决Pandas方法链中整合pd.to_datetime()的问题
你的问题出在第二个assign里的lambda表达式——你引用的是原始数据框tcap的date_time列,而不是经过前一步处理后生成的新列。把tcap['date_time']换成df['date_time']就能解决这个问题,因为lambda里的df代表的是前一步方法链返回的中间数据框。
修正后的方法链代码
tcap2 = tcap.\ assign(person = tcap['text'].apply(lambda x: x.split(" ", 1)[0]), date_time = tcap['text'].str.extract(r'\(([^()]+)\)'), text = tcap['text'].str.split(': ').str[1]).\ assign(date_time = lambda df: pd.to_datetime(df['date_time']))
更简洁的写法:在同一个assign里直接转换
你也可以不用拆分两次assign,在第一次生成date_time列的时候就直接转换为datetime类型,代码更紧凑:
tcap2 = tcap.\ assign(person = tcap['text'].apply(lambda x: x.split(" ", 1)[0]), date_time = lambda df: pd.to_datetime(df['text'].str.extract(r'\(([^()]+)\)')), text = tcap['text'].str.split(': ').str[1])
这里用lambda引用当前的中间数据框df,提取日期字符串后直接用pd.to_datetime转换,一步到位。
额外优化:替换apply为str.split
你提取person列用了apply,其实可以用Pandas的字符串方法更高效地实现:
tcap2 = tcap.\ assign(person = tcap['text'].str.split(" ", n=1).str[0], date_time = lambda df: pd.to_datetime(df['text'].str.extract(r'\(([^()]+)\)')), text = tcap['text'].str.split(': ', n=1).str[1])
用str.split(n=1)指定只拆分一次,比apply里的lambda更符合Pandas的向量化操作习惯,性能也更好。
内容的提问来源于stack exchange,提问作者Robert Chestnutt
相关产品推荐
相关产品推荐

