랭귀지/pandas
pandas의 str.split(expand=True)를 사용한 방법
유키공
2025. 3. 17. 18:18
import pandas as pd
import numpy as np
import time
# 테스트 데이터 생성 (400만 건)
n_rows = 4_000_000
df = pd.DataFrame({
'y_col': [f'text_{i}' for i in range(n_rows - 2)] + ['no_underscore', None]
})
# 결과를 저장할 DataFrame 생성
result_df = df.copy()
# 방법 1: str.split + 열 할당
start_time = time.time()
debris = result_df['y_col'].str.split('_', expand=True)
result_df['a_split'] = debris[0]
result_df['b_split'] = debris[1]
end_time = time.time()
print(f"방법 1 (str.split + 열 할당): {end_time - start_time:.4f} 초")
# 방법 2: str.split + 한 번에 열 할당
start_time = time.time()
result_df[['a_split_once', 'b_split_once']] = result_df['y_col'].str.split('_', expand=True)
end_time = time.time()
print(f"방법 2 (str.split + 한 번에 열 할당): {end_time - start_time:.4f} 초")
# 방법 3: str.extract + 정규 표현식
start_time = time.time()
result_df[['a_extract', 'b_extract']] = result_df['y_col'].str.extract(r'(\w+)_(\w+)')
end_time = time.time()
print(f"방법 3 (str.extract): {end_time - start_time:.4f} 초")
# 방법 4: str.partition
start_time = time.time()
partition_result = result_df['y_col'].str.partition('_')
result_df['a_partition'] = partition_result[0]
result_df['b_partition'] = partition_result[2]
end_time = time.time()
print(f"방법 4 (str.partition): {end_time - start_time:.4f} 초")
# 결과 확인
print("\n결과 샘플 (처음 5행 및 마지막 2행):")
print(result_df.head())
print(result_df.tail())
import pandas as pd
import numpy as np
import time
# 400만 건의 테스트 데이터 생성
n_rows = 4_000_000
df = pd.DataFrame({
'y_col': [f'text_{i}' for i in range(n_rows)]
})
# 방법 1: str.split + 열 할당
start_time = time.time()
debris = df['y_col'].str.split('_', expand=True)
df['a'] = debris[0]
df['b'] = debris[1]
end_time = time.time()
print(f"방법 1 (str.split + 열 할당): {end_time - start_time:.4f} 초")
# 데이터 초기화
df.drop(columns=['a', 'b'], inplace=True)
# 방법 2: str.split + 한 번에 열 할당
start_time = time.time()
df[['a', 'b']] = df['y_col'].str.split('_', expand=True)
end_time = time.time()
print(f"방법 2 (str.split + 한 번에 열 할당): {end_time - start_time:.4f} 초")
# 데이터 초기화
df.drop(columns=['a', 'b'], inplace=True)
# 방법 3: str.extract + 정규 표현식
start_time = time.time()
df[['a', 'b']] = df['y_col'].str.extract(r'(\w+)_(\w+)')
end_time = time.time()
print(f"방법 3 (str.extract): {end_time - start_time:.4f} 초")
start_time = time.time()
df[['a', 'b']] = df['y_col'].str.partition('_')[[0, 2]]
end_time = time.time()
print(f"방법 4 (str.partition 한 번에 할당): {end_time - start_time:.4f} 초")
df[['a', 'b']] = df['y_col'].str.split('_', expand=True)
import pandas as pd
import numpy as np
# 예제 데이터 (널 값 포함)
df = pd.DataFrame({'y_col': ['apple_red', 'banana_yellow', 'grape_purple', None, 'orange']})
# NaN을 빈 문자열로 변환한 후 NumPy로 처리
debris = df['y_col'].fillna('_').str.split('_', n=1, expand=True).to_numpy()
df['a'], df['b'] = debris[:, 0], debris[:, 1]
# b 컬럼이 NaN이면 빈 문자열 처리
df['b'] = df['b'].fillna('')
print(df)
import pandas as pd
import numpy as np
# 예시 데이터
data = {'y_col': ['apple_red', 'banana', 'grape_purple']}
df = pd.DataFrame(data)
# 두 번째 코드 (수정 후)
df['a'] = [x.split('_')[0] for x in df['y_col']]
df['b'] = [x.split('_')[1] if '_' in x else np.nan for x in df['y_col']]
print(df)
df[y_col] = df[y_col].astype(str)
df['a'] = [x.split('_')[0] if '_' in x else None for x in df[y_col]]
df['b'] = [x.split('_')[1] if '_' in x else None for x in df[y_col]]