是我的问题陈述-
我有 columnA 的数据集,如
import pandas as pd 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 的子字符串创建一个新的 columnB 但有一个问题。条件是,
如果每行的最后 3 个字符是 — 那么我需要提取 XX ,即第 12 个和第 13 个字符并将其添加到新的 columnB 中,否则我需要捕获最后 3 个字符并将它们添加到 columnB 。我想要的输出将如下所示 -
如何在不使用任何循环的情况下有效地创建这个新的 columnB?
我试过这个并且只为我工作了1个案例:
df['columnB'] = df.columnA.str[-3:] df[columnB] = df.['columnA'].str.extract('([A-Za,z]{2}---)', expand=True)
这给了我所有不以 ‘—‘ 结尾但以 ‘—‘ 结尾的列的最后 3 个字符,我知道这是错误的。我也尝试了 str.extract 与正则表达式,但它给了我所有以’—‘结尾的行的正确值,但不是其他行。请帮忙。
你可以使用np.where
np.where
import numpy as np df['columnB'] = np.where(df['columnA'].str.endswith('---'), df['columnA'].str.slice(11,13), df['columnA'].str.slice(-3)) print(df)
结果
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