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