簡體   English   中英

基於多個字符拆分pandas數據框的列

[英]Split column of pandas dataframe based on multiple characters

我有一個看起來像這樣的熊貓數據框:

   Un_ID  P_ID   segment      
0   Q8TDU6  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)  
1   P63092  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)  
2   Q8TDU6  7cfm    1( 22- 41), 2( 51- 72), 3( 86- 108) 

我想將第三列的“段”分成三列,即 TM、開始、結束

   Un_ID    P_ID                   segment                TM starting ending
0   Q8TDU6  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)   TM1 16       41
1   P63092  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)   TM1 16       41
2   Q8TDU6  7cfm    1( 22- 41), 2( 51- 72), 3( 86- 108)   TM1 22       41
0   Q8TDU6  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)   TM2 51       73
1   P63092  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)   TM2 51       73
2   Q8TDU6  7cfm    1( 22- 41), 2( 51- 72), 3( 86- 108)   TM2 51       72
0   Q8TDU6  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)   TM3 86       108
1   P63092  7bw0    1( 16- 41), 2( 51- 73), 3( 86- 108)   TM3 86       108
2   Q8TDU6  7cfm    1( 22- 41), 2( 51- 72), 3( 86- 108)   TM3 86       108

我試過以下代碼

df[['TM','starting','ending']] = df.segment.apply(lambda x: pd.Series(str(x).split(","))

但是,我不知道如何操作上面的代碼來獲取我想要的數據幀..

嘗試使用.str.extractall然后join

pattern = '(?P<TM>\d+)\( (?P<starting>\d+)- (?P<ending>\d+)'
df = df.join(df.segment.str.extractall(pattern).reset_index('match', drop=True))

df['TM'] = 'TM' + df['TM']

輸出:

    Un_ID  P_ID                              segment   TM starting ending
0  Q8TDU6  7bw0  1( 16- 41), 2( 51- 73), 3( 86- 108)  TM1       16     41
0  Q8TDU6  7bw0  1( 16- 41), 2( 51- 73), 3( 86- 108)  TM2       51     73
0  Q8TDU6  7bw0  1( 16- 41), 2( 51- 73), 3( 86- 108)  TM3       86    108
1  P63092  7bw0  1( 16- 41), 2( 51- 73), 3( 86- 108)  TM1       16     41
1  P63092  7bw0  1( 16- 41), 2( 51- 73), 3( 86- 108)  TM2       51     73
1  P63092  7bw0  1( 16- 41), 2( 51- 73), 3( 86- 108)  TM3       86    108
2  Q8TDU6  7cfm  1( 22- 41), 2( 51- 72), 3( 86- 108)  TM1       22     41
2  Q8TDU6  7cfm  1( 22- 41), 2( 51- 72), 3( 86- 108)  TM2       51     72
2  Q8TDU6  7cfm  1( 22- 41), 2( 51- 72), 3( 86- 108)  TM3       86    108

注意:有關正則表達式模式的說明,請參閱regex101

嘗試:

import re

r = re.compile(r"(\d+)\(\s*(\d+)-\s*(\d+)\)")

df["segment"] = df["segment"].apply(lambda x: r.findall(x))
df = df.explode("segment")
df[["TM", "starting", "ending"]] = df.pop("segment").apply(pd.Series)
df = df.sort_values(by="TM")
df["TM"] = "TM" + df["TM"].astype(str)
print(df)

印刷:

    Un_ID  P_ID   TM starting ending
0  Q8TDU6  7bw0  TM1       16     41
1  P63092  7bw0  TM1       16     41
2  Q8TDU6  7cfm  TM1       22     41
0  Q8TDU6  7bw0  TM2       51     73
1  P63092  7bw0  TM2       51     73
2  Q8TDU6  7cfm  TM2       51     72
0  Q8TDU6  7bw0  TM3       86    108
1  P63092  7bw0  TM3       86    108
2  Q8TDU6  7cfm  TM3       86    108

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM