如何不使用循环为Pandas DataFrame高效生成columnB列?
高效实现Pandas新列生成需求
可以用Pandas的矢量化字符串操作结合numpy.where来实现,完全不需要循环,效率拉满:
import pandas as pd import numpy as np df = pd.DataFrame({ 'columnA': ['DD22HAHTL1NXX---', 'DD22HATNT1N--D3F', 'DD22HATNT1N--B3F', 'DD22HAHTL1N--A3F', 'DD22HATNT1N--C1F', 'DD22HAHTL1N--A3F', 'DD22HATNT1N--B3F', 'DD22HAHTL1N--A3F', 'DD22HAHTL1N--A3E', 'DD22HAHTL1N--A3F', 'DD22HAHTL1N--B3F', 'DD22HAHTL1N--A3F', 'DD22HAHTL1N--A3F', 'DD22HAHTL1NZZ---', 'DD22HAHTL1N--A3E']}) # 生成条件:判断columnA最后3个字符是否为--- condition = df['columnA'].str.endswith('---') # 用numpy.where实现分支赋值 df['columnB'] = np.where( condition, df['columnA'].str[11:13], # 满足条件时取第12、13位(Python索引从0开始,对应11到13的切片) df['columnA'].str[-3:] # 不满足时取最后3个字符 ) print(df)
代码说明
df['columnA'].str.endswith('---'):矢量化判断每行字符串是否以---结尾,返回布尔值序列df['columnA'].str[11:13]:利用Pandas字符串切片,直接提取每行第12、13位字符(索引从0开始,切片左闭右开)df['columnA'].str[-3:]:提取每行最后3个字符np.where:根据布尔条件选择对应值,全程矢量化操作,比循环效率高很多
运行后columnB的结果如下:
columnA columnB 0 DD22HAHTL1NXX--- XX 1 DD22HATNT1N--D3F D3F 2 DD22HATNT1N--B3F B3F 3 DD22HAHTL1N--A3F A3F 4 DD22HATNT1N--C1F C1F 5 DD22HAHTL1N--A3F A3F 6 DD22HATNT1N--B3F B3F 7 DD22HAHTL1N--A3F A3F 8 DD22HAHTL1N--A3E A3E 9 DD22HAHTL1N--A3F A3F 10 DD22HAHTL1N--B3F B3F 11 DD22HAHTL1N--A3F A3F 12 DD22HAHTL1N--A3F A3F 13 DD22HAHTL1NZZ--- ZZ 14 DD22HAHTL1N--A3E A3E
内容的提问来源于stack exchange,提问作者kishore
相关产品推荐
相关产品推荐

