정규식을 사용하여 열을 분할하려고하는데 분할을 올바르게 얻을 수없는 것 같습니다. 모든 후행 CAPS를 가져 와서 별도의 열로 옮기려고합니다. 그래서 나는 2-4 CAPS의 모든 CAPS를 연속적으로 얻고 있습니다. 그러나 열이 비어있는 'Name'
동안에는 열만 남습니다 'Team'
.
내 코드는 다음과 같습니다.
import pandas as pd
url = "https://www.espn.com/nba/stats/player/_/table/offensive/sort/avgAssists/dir/desc"
df = pd.read_html(url)[0].join(pd.read_html(url)[1])
df[['Name','Team']] = df['Name'].str.split('[A-Z]{2,4}', expand=True)
나는 이것을 원한다 :
print(df.head(5).to_string())
RK Name POS GP MIN PTS FGM FGA FG% 3PM 3PA 3P% FTM FTA FT% REB AST STL BLK TO DD2 TD3 PER
0 1 LeBron JamesLA SF 35 35.1 24.9 9.6 19.7 48.6 2.0 6.0 33.8 3.7 5.5 67.7 7.9 11.0 1.3 0.5 3.7 28 9 26.10
1 2 Ricky RubioPHX PG 30 32.0 13.6 4.9 11.9 41.3 1.2 3.7 31.8 2.6 3.1 83.7 4.6 9.3 1.3 0.2 2.5 12 1 16.40
2 3 Luka DoncicDAL SF 32 32.8 29.7 9.6 20.2 47.5 3.1 9.4 33.1 7.3 9.1 80.5 9.7 8.9 1.2 0.2 4.2 22 11 31.74
3 4 Ben SimmonsPHIL PG 36 35.4 14.9 6.1 10.8 56.3 0.1 0.1 40.0 2.7 4.6 59.0 7.5 8.6 2.2 0.7 3.6 19 3 19.49
4 5 Trae YoungATL PG 34 35.1 28.9 9.3 20.8 44.8 3.5 9.4 37.5 6.7 7.9 85.0 4.3 8.4 1.2 0.1 4.8 11 1 23.47
이되기 위해 :
print(df.head(5).to_string())
RK Name Team POS GP MIN PTS FGM FGA FG% 3PM 3PA 3P% FTM FTA FT% REB AST STL BLK TO DD2 TD3 PER
0 1 LeBron James LA SF 35 35.1 24.9 9.6 19.7 48.6 2.0 6.0 33.8 3.7 5.5 67.7 7.9 11.0 1.3 0.5 3.7 28 9 26.10
1 2 Ricky Rubio PHX PG 30 32.0 13.6 4.9 11.9 41.3 1.2 3.7 31.8 2.6 3.1 83.7 4.6 9.3 1.3 0.2 2.5 12 1 16.40
2 3 Luka Doncic DAL SF 32 32.8 29.7 9.6 20.2 47.5 3.1 9.4 33.1 7.3 9.1 80.5 9.7 8.9 1.2 0.2 4.2 22 11 31.74
3 4 Ben Simmons PHIL PG 36 35.4 14.9 6.1 10.8 56.3 0.1 0.1 40.0 2.7 4.6 59.0 7.5 8.6 2.2 0.7 3.6 19 3 19.49
4 5 Trae Young ATL PG 34 35.1 28.9 9.3 20.8 44.8 3.5 9.4 37.5 6.7 7.9 85.0 4.3 8.4 1.2 0.1 4.8 11 1 23.47
답변
당신은 같은 정규식을 사용하여 두 개의 컬럼에 데이터를 추출 할 수있다 ^(.*?)([A-Z]+)$
또는 ^(.*[^A-Z])([A-Z]+)$
:
df[['Name','Team']] = df['Name'].str.extract('^(.*?)([A-Z]+)$', expand=True)
이렇게하면 그룹 “이름”의 대문자가 아닌 마지막 문자, 그룹 “팀”의 마지막 대문자가 모두 유지됩니다.
참조 정규식 데모 # 1 과 정규식 데모 # 2
세부
^
-문자열의 시작(.*?)
– 캡처 그룹 1 : 가능한 몇 가지와 같은 제로 또는 줄 바꿈 문자 이외의 많은 문자,
또는(.*[^A-Z])
-줄 바꿈 문자 이외의 0 개 이상의 문자는 가능한 한 많은 ASCII 대문자가 아닌 마지막 문자까지 (다음 패턴이 일치하도록 부여됨) (이 패턴은 마지막 대문자)([A-Z]+)
-캡처 그룹 2 : 하나 이상의 ASCII 대문자$
-문자열 끝.
답변
기능을 약간 변경했습니다. 패키지를 다시 추가해야 할 수도 있습니다.
약간의 매뉴얼이지만 이것이 충분하기를 바랍니다. 좋은 하루 되세요!
df_obj_skel = dict()
df_obj_skel['Name'] = list()
df_obj_skel['Team'] = list()
for index,row in df.iterrows():
Name = row['Name']
Findings = re.search('[A-Z]{2,4}$', Name)
Refined_Team = Findings[0]
Refined_Name = re.sub(Refined_Team + "$", "", Name)
df_obj_skel['Team'].append(Refined_Team)
df_obj_skel['Name'].append(Refined_Name)
df_final = pd.DataFrame(df_obj_skel)
print(df_final)