programing

Pandas 데이터 프레임의 문자열에 선행 0 추가

batch 2023. 7. 25. 20:46
반응형

Pandas 데이터 프레임의 문자열에 선행 0 추가

처음 세 개의 열이 문자열인 판다 데이터 프레임이 있습니다.

         ID        text1    text 2
0       2345656     blah      blah
1          3456     blah      blah
2        541304     blah      blah        
3        201306       hi      blah        
4   12313201308    hello      blah         

ID에 선행 0을 추가합니다.

                ID    text1    text 2
0  000000002345656     blah      blah
1  000000000003456     blah      blah
2  000000000541304     blah      blah        
3  000000000201306       hi      blah        
4  000012313201308    hello      blah 

시도해 본 결과:

df['ID'] = df.ID.zfill(15)
df['ID'] = '{0:0>15}'.format(df['ID'])

str속성은 문자열에 대부분의 메서드를 포함합니다.

df['ID'] = df['ID'].str.zfill(15)

보기: http://pandas.pydata.org/pandas-docs/stable/text.html

시도:

df['ID'] = df['ID'].apply(lambda x: '{0:0>15}'.format(x))

아니 심지어는

df['ID'] = df['ID'].apply(lambda x: x.zfill(15))

Python 3.6+에서는 f-string도 사용할 수 있습니다.

df['ID'] = df['ID'].map(lambda x: f'{x:0>15}')

성능이 비교 가능하거나 약간 나쁨df['ID'].map('{:0>15}'.format)반면에, f-string은 더 복잡한 출력을 허용하고 목록 이해를 통해 더 효율적으로 사용할 수 있습니다.

성능 벤치마킹

# Python 3.6.0, Pandas 0.19.2

df = pd.concat([df]*1000)

%timeit df['ID'].map('{:0>15}'.format)                  # 4.06 ms per loop
%timeit df['ID'].map(lambda x: f'{x:0>15}')             # 5.46 ms per loop
%timeit df['ID'].astype(str).str.zfill(15)              # 18.6 ms per loop

%timeit list(map('{:0>15}'.format, df['ID'].values))    # 7.91 ms per loop
%timeit ['{:0>15}'.format(x) for x in df['ID'].values]  # 7.63 ms per loop
%timeit [f'{x:0>15}' for x in df['ID'].values]          # 4.87 ms per loop
%timeit [str(x).zfill(15) for x in df['ID'].values]     # 21.2 ms per loop

# check results are the same
x = df['ID'].map('{:0>15}'.format)
y = df['ID'].map(lambda x: f'{x:0>15}')
z = df['ID'].astype(str).str.zfill(15)

assert (x == y).all() and (x == z).all()

초기화하는 동안 한 줄로 수행할 수 있습니다.변환자 인수를 사용합니다.

df = pd.read_excel('filename.xlsx', converters={'ID': '{:0>15}'.format})

그래서 코드 길이를 절반으로 줄일 수 있습니다 :)

PS: read_csv에도 이 인수가 있습니다.

오류가 발생하는 경우:

Pandas 오류: pandas에서 np.object_dtype을 사용하는 문자열 값이 있는 .straccessor만 사용할 수 있습니다.

df['ID'] = df['ID'].astype(str).str.zfill(15)

이 문제에 대한 보다 사용자 정의 가능한 솔루션을 원한다면 시도해 볼 수 있습니다.

df['ID'] = df['ID'].astype(str).str.pad(15, side='left', fillchar='0')

str.zfill(n)에 해당하는 특수한 경우str.pad(n, side='left', fillchar='0')

방금 저를 위해 일했습니다.

df['ID']= df['ID'].str.rjust(15,'0')

판다의 숫자 열에 선행 0을 추가합니다.

df['ID']=df['ID'].apply(lambda x: '{0:0>15}'.format(x))

ADD 판다의 문자 열에 선행 0을 추가합니다.

방법 1: Zfill 사용

df['ID'] = df['ID'].str.zfill(15)

방법 2: rjust() 함수 사용

df['ID']=df['ID'].str.rjust(15, "0")

출처: https://www.datasciencemadesimple.com/add-leading-preceding-zeros-python/

언급URL : https://stackoverflow.com/questions/23836277/add-leading-zeros-to-strings-in-pandas-dataframe

반응형