![](/img/trans.png)
[英]Split pandas dataframe column of type string into multiple columns based on number of ',' characters
[英]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.