Python pandas DataFrame中如何拆分列元素并使用其他列值替换指定部分
解决方案
方法1:向量化操作(推荐,效率最高)
直接用np.where配合pandas内置的字符串方法实现,不需要循环,代码如下:
import pandas as pd import numpy as np # 你的示例数据 d = {'col1': ['a b', 'a c'], 'col2': ['z 26', 'y 25']} df = pd.DataFrame(data=d) # 生成col3的核心逻辑 df['col3'] = np.where( df['col1'] == 'a b', # 匹配条件:col1等于a b # 满足条件时,取col1拆分后的第一个元素 + 空格 + col2拆分后的第一个元素 df['col1'].str.split(' ').str[0] + ' ' + df['col2'].str.split(' ').str[0], df['col1'] # 不满足条件直接保留col1原值 ) print(df)
输出结果和你要求的完全一致:
col1 col2 col3 0 a b z 26 a z 1 a c y 25 a c
方法2:apply自定义逻辑(适合更复杂的替换规则)
如果后续替换规则变复杂,可以用apply逐行处理:
def gen_col3(row): if row['col1'] == 'a b': col1_part = row['col1'].split(' ')[0] col2_part = row['col2'].split(' ')[0] return f"{col1_part} {col2_part}" else: return row['col1'] df['col3'] = df.apply(gen_col3, axis=1)
之前写法报错原因
- 第一种写法错误:
np.where第一个参数需要传入和行数长度一致的布尔数组,你传入了df[df['col1']=='a b']是过滤后的子DataFrame,维度不匹配- 字符串拆分后直接写
[1]是取整个Series的第1个元素,不是取每行拆分后的对应位置的值,需要加.str访问每行的元素
- 第二种写法错误:
- 循环中直接修改x不会同步修改原DataFrame的值
df['col1'].str.split(' ')[1]返回的是Series对象,不是单个字符串,不符合replace方法的参数要求
内容的提问来源于stack exchange,提问作者vishvas chauhan
相关产品推荐
相关产品推荐

