小编典典

pandas-基于A列中的值相应地填充B列中的值而无需迭代。(for循环)

all

是我的问题陈述-

我有 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 与正则表达式,但它给了我所有以’—‘结尾的行的正确值,但不是其他行。请帮忙。


阅读 68

收藏
2022-07-27

共1个答案

小编典典

你可以使用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
2022-07-27