用熊猫提取包含特定字符的数据

时间:2018-10-30 02:06:21

标签: python string python-3.x pandas dataframe

我想提取另一列中包含特定字符串的数据。

例如,提取的目标类似于“另一个列字符串+ 3位数字”字符。
它有错误。我想获得TARGET行。

df = pd.DataFrame({'col1':['xxxx', 'yyyy', 'zzzz'],'col2':['xxxx123','yyyy1234','aaa123']})

col1 | col2
xxxx | xxxx123 <- TARGET 
yyyy | yyyy1234  <- Not TARGET
zzzz | aaaa123  <- Not TARGET

这是我的无效代码。

print(df[df['col1'].str.match(df['col2'] + [0-9][0-9][0-9])])

我尝试了str.contains和str.match和isin。 可能我不知道如何使用它们。

请让我知道该怎么做。

3 个答案:

答案 0 :(得分:3)

两个模式匹配,并过滤数据框

train_df['intday'] = train_df['day'].str.replace('-','').astype(int)

>>> train_df
          day    intday
0  2018-10-30  20181030
1   2018-9-25   2018925
2   2018-9-30   2018930

答案 1 :(得分:1)

您可以按两个布尔蒙版的交集进行过滤:

n = 3  # number of digits
mask1 = pd.to_numeric(df['col2'].str[-n:], errors='coerce').notnull()
mask2 = [col2[:-n] == col1 for col1, col2 in zip(df['col1'], df['col2'])]

df_slice = df[mask1 & mask2]

print(df_slice)

   col1     col2
0  xxxx  xxxx123

性能基准测试

与常规str操作相比,您可能会发现正则表达式价格昂贵。目前,熊猫str方法也很有效。

df = pd.DataFrame({'col1':['xxxx', 'yyyy', 'zzzz'],'col2':['xxxx123','yyyy1234','aaa123']})

def vai(df):
    cond1 = df.col2.str.extract('([A-Za-z]+)\d', expand = False).eq(df.col1)
    cond2 = df.col2.str.extract('[A-Za-z](\d{3})$', expand = False)
    return cond1 & cond2

def jpp(df):
    n = 3  # number of digits
    mask1 = pd.to_numeric(df['col2'].str[-n:], errors='coerce').notnull()
    mask2 = [col2[:-n] == col1 for col1, col2 in zip(df['col1'], df['col2'])]
    return mask1 & mask2


def jpp2(df):
    n = 3  # number of digits
    mask1 = pd.to_numeric(df['col2'].str[-n:], errors='coerce').notnull()
    mask2 = df['col2'].str[:-n] == df['col1']
    return mask1 & mask2

df = pd.concat([df]*1000)

assert vai(df).equals(jpp(df)) and vai(df).equals(jpp2(df))

%timeit vai(df)   # 17.3 ms per loop
%timeit jpp(df)   # 5.4 ms per loop
%timeit jpp2(df)  # 8.01 ms per loop

答案 2 :(得分:0)

您可以编写一个执行字符串匹配或使用正则表达式的函数,并将其传递给apply()方法。