Python 字符串模式匹配&;两列之间的索引-熊猫

Python 字符串模式匹配&;两列之间的索引-熊猫,python,pandas,Python,Pandas,我有一个带有两个文本列的数据框。一列的列值(比如B列)基本上是另一列(比如a列)整个字符串的子字符串/部分。我想在每一列中找到模式,并检查A列字符串的位置或起始字母的趋势。因此我想生成三列,一列是子字符串的位置,另外两列是前面和后面的字符 以下是dataframe的外观: | Col A | Col B | ---------------------- AGHXXXJ002 | XXX | AGHGHJJ002 | GHJ | ABCRTGHP001 | RTGH | AB

我有一个带有两个文本列的数据框。一列的列值(比如B列)基本上是另一列(比如a列)整个字符串的子字符串/部分。我想在每一列中找到模式,并检查A列字符串的位置或起始字母的趋势。因此我想生成三列,一列是子字符串的位置,另外两列是前面和后面的字符

以下是dataframe的外观:

| Col A     | Col B |
----------------------
AGHXXXJ002  | XXX   |
AGHGHJJ002  | GHJ   |
ABCRTGHP001 | RTGH  |
ABCDFFP01   | DFF   |
ABCXGHJD09  | XGH   |
现在,基于上述模式,我想生成两列:

| Col A     | Col B | Position                  | Preceding Chars | Following Chars |
-------------------------------------------------------------------------------------
AGHXXXJ002  | XXX   | [3, 5]                    |  AGH            | J002            |
 (Because XXX starts at index 3 and ends at 5)  |                 |                 |
AGHGHJJ002  | GHJ   | [3, 5]                    |  AGH            | J002            |
ABCRTGHP001 | RTGH  | [3, 6]                    |  ABC            | P001            |
ABCDFFP01   | DFFP  | [3, 5]                    |  ABC            | 01              |
ABCXGHJD09  | XGH   | [3, 5]                    |  ABC            | D09             |
HGMQQUTV01  | HGM   | [0, 2]                    |  NaN            | QQUTV01         |
GBHUJJS099  | BHU   | [1, 3]                    |  G              | JJS099          |

这是我想要的输出。我尝试使用for循环并删除子字符串,但从未执行,因此删除了代码。到目前为止,我一直在手动操作,但有超过5万行,这是不可行的。此外,“位置”列可以分为两个不同的列,即“开始位置”和“结束位置”。

它可能会对您有所帮助

>>重新导入
>>>进口大熊猫
>>>df=pandas.DataFrame([[“AGHXXXJ002”、“XXX”]、[“AGHghJ002”、“GHJ”]、[“ABCRTGHP001”、“RTGH”]、[“ABCDFFP01”、“DFF”]、[“ABCXGHJD09”、“XGH”]、列=[“A列”、“B列])
>>>df
A列B列
0 AGHXXXJ002 XXX
1 AGHGHJ002 GHJ
2 ABCRTGHP001 RTGH
3 ABCDFFP01 DFF
4 ABCXGHJD09 XGH
>>>def get_位置(世界其他地区):
...     匹配=重新搜索(第[“列B”]、第[“列A”]行)
...     如果匹配:
...             返回match.span()
...     其他:
...             返回[-1,-1]
... 
>>>df[“位置”]=df.apply(获取位置,轴=1)
>>>df
A列B列位置
0 AGHXXXJ002 XXX(3,6)
1 AGHGHJ002 GHJ(3,6)
2 ABCRTGHP001 RTGH(3,7)
3 ABCDFFP01 DFF(3,6)
4 ABCXGHJD09 XGH(3,6)
>>>def get_前一行:
...     如果行[“位置”][0]=-1:
...             返回“”
...     返回行[“列A”][:行[“位置”][0]]
... 
>>>df[“前置字符”]=df.apply(get_前置,轴=1)
>>>df
A列B列字符前的位置
0 AGHXXXJ002 XXX(3,6)AGH
1 AGHGHJ002 GHJ(3,6)AGH
2 ABCRTGHP001 RTGH(3,7)ABC
3 ABCDFFP01 DFF(3,6)ABC
4 ABCXGHJD09 XGH(3,6)ABC
>>>def get_如下(第行):
...     如果行[“位置”][1]=-1:
...             返回“”
...     返回行[“列A”][行[“位置”][1]:]
... 
>>>df[“跟随字符”]=df.apply(获得跟随,轴=1)
>>>df
第A列第B列字符前一个字符后一个字符的位置
0 AGHXXXJ002 XXX(3,6)AGH J002
1 AGHGHJ002 GHJ(3,6)AGH J002
2 ABCRTGHP001 RTGH(3,7)ABC P001
3 ABCDFFP01 DFF(3,6)ABC P01
4 ABCXGHJD09 XGH(3,6)ABC JD09

在我们处理行级操作和字符串时,没有一种矢量化方法可以做到这一点

让我们使用
str.find
np.char.find
创建数据帧

#Note I've removed the spaces in your columns.
s = pd.DataFrame(df.apply(lambda x : x['ColA'].split(x['ColB']),axis=1).tolist())
idx = df.apply(lambda x : np.char.find(x['ColA'],x['ColB']),1)

pos = zip(idx.values, (idx - 1 + df["ColB"].str.len()).values)

df["Position"] = list(pos)
df['Proceeding Chars'], df['Following Chars'] = s[0], s[1]

print(df)

        ColA  ColB Position Proceeding Chars Following Chars
0   AGHXXXJ002   XXX   (3, 5)              AGH            J002
1   AGHGHJJ002   GHJ   (3, 5)              AGH            J002
2  ABCRTGHP001  RTGH   (3, 6)              ABC            P001
3    ABCDFFP01   DFF   (3, 5)              ABC             P01
4   ABCXGHJD09   XGH   (3, 5)              ABC            JD09
5   HGMQQUTV01   HGM   (0, 2)                          QQUTV01
6   GBHUJJS099   BHU   (1, 3)                G          JJS099
#Note I've removed the spaces in your columns.
s = pd.DataFrame(df.apply(lambda x : x['ColA'].split(x['ColB']),axis=1).tolist())
idx = df.apply(lambda x : np.char.find(x['ColA'],x['ColB']),1)

pos = zip(idx.values, (idx - 1 + df["ColB"].str.len()).values)

df["Position"] = list(pos)
df['Proceeding Chars'], df['Following Chars'] = s[0], s[1]

print(df)

        ColA  ColB Position Proceeding Chars Following Chars
0   AGHXXXJ002   XXX   (3, 5)              AGH            J002
1   AGHGHJJ002   GHJ   (3, 5)              AGH            J002
2  ABCRTGHP001  RTGH   (3, 6)              ABC            P001
3    ABCDFFP01   DFF   (3, 5)              ABC             P01
4   ABCXGHJD09   XGH   (3, 5)              ABC            JD09
5   HGMQQUTV01   HGM   (0, 2)                          QQUTV01
6   GBHUJJS099   BHU   (1, 3)                G          JJS099