如何用一行代码实现Pandas多列指定规则拆分并原地修改
一行代码实现Pandas多列指定规则拆分(原地修改)
先还原你的场景:你有这样的DataFrame,原本是逐列手动拆分的:
>>> df ID Started 0 NaN 20.06.2017 13:19:04 1 NaN 10.04.2018 04:48:32 2 WBTS-1509 06.11.2017 10:28:14 3 WBTS-1509 03.03.2018 10:12:29 4 WBTS-1117 07.03.2018 17:04:28
你之前的拆分代码是逐列写的:
df['Started'].apply(lambda x: x.split(':')[0]) df['ID'].apply(lambda x: x.split('-')[1])
现在你已经定义了三个对应规则的列表:
col_names = ['ID' , 'Started'] splitby = ['-' , ':'] index_after_split = [1 , 0]
想要一行代码完成所有列的拆分,还要原地修改(inplace=True),不用循环?安排!
直接用这行代码:
df.update(pd.DataFrame({col: df[col].apply(lambda x: x.split(split)[idx] if pd.notna(x) else x) for col, split, idx in zip(col_names, splitby, index_after_split)}))
为什么这行代码能生效?
- 用
zip(col_names, splitby, index_after_split)把列名、拆分符、目标索引一一对应,避免了显式循环 - 字典推导式遍历每一组对应关系,对每个列做拆分处理:特意加了
if pd.notna(x) else x是为了处理ID列里的NaN值,不然直接调用split会报错 - 把处理后的结果转成DataFrame,再用
df.update()方法原地修改原DataFrame——update会自动匹配列名和索引,只替换对应位置的有效值,完美符合你的需求
执行后的结果
运行完上面的代码后,你的df会变成这样:
>>> df ID Started 0 NaN 20.06.2017 13 1 NaN 10.04.2018 04 2 1509 06.11.2017 10 3 1509 03.03.2018 10 4 1117 07.03.2018 17
内容的提问来源于stack exchange,提问作者Bharat Sharma
相关产品推荐
相关产品推荐

