Pandas를 사용하여 문자열 열의 각 값에 문자열 접두사 추가


119

팬더 데이터 프레임의 해당 열에서 각 값의 시작 부분에 문자열을 추가하고 싶습니다 (우아하게). 나는 이미 이것을 수행하는 방법을 알아 냈고 현재 다음을 사용하고 있습니다.

df.ix[(df['col'] != False), 'col'] = 'str'+df[(df['col'] != False), 'col']

이것은 할 수있는 일이 지옥처럼 보입니다-다른 방법을 알고 있습니까 (그 열이 0 또는 NaN 인 행에 문자를 추가 할 수도 있음)?

아직 명확하지 않은 경우 다음 단계로 전환하겠습니다.

    col 
1     a
2     0

으로:

       col 
1     stra
2     str0

정확히 무엇을 요구하십니까? 코드가 무엇을하는지에 대한 설명을 적어주세요 /이 한 소원
라이언 작센

1
예제 코드가하는 일이 일반 팬더 사용자에게 매우 명확하다고 생각했습니다. 편의를 위해 사용 사례를 추가했습니다.
TheChymera 2013

3
설명이 코드와 다소 상충됩니다. 에 무슨 일입니다 != False사업? str모든 값 에 추가 하시겠습니까, 아니면 일부에만 추가 하시겠습니까?
BrenBarn 2013

내 예제 데이터 프레임에 표시된 것처럼 모든 값에.
TheChymera

1
귀하의 예는 여전히 약간 불분명합니다. 원하는 것을 원 df['col'] = 'str' + df['col'].astype(str)하십니까?
Roman Pekar

답변:


223
df['col'] = 'str' + df['col'].astype(str)

예:

>>> df = pd.DataFrame({'col':['a',0]})
>>> df
  col
0   a
1   0
>>> df['col'] = 'str' + df['col'].astype(str)
>>> df
    col
0  stra
1  str0

1
감사합니다. 관심이 있다면 데이터 프레임 인덱스도 이러한 문자열 조작을 지원합니다.
tagoma

2
연결하기 전에 조건이 충족되어야하는 경우 어떻게해야합니까?
acecabana

1
@tagoma, 4 년 후 예 : 데이터 프레임 인덱스도 지원합니다. 새 열을 만들고 인덱스 값에 다음과 같이 추가 할 수 있습니다. df [ 'col'] = 'str'+ df.index.astype (str)
MEdwin

결국 파일에 저장하려고하면 "astype (str)"이 인코딩을 망칠 수 있습니다.
Raein Hashemi

2
이 방법과 다른 방법을 시도하면 SettingWithCopyWarning이 발생합니다. 그것을 피할 수있는 방법이 있습니까?
Madan Ivan

13

대안으로, 예를 들어 접미사를 추가하거나 요소 자체를 조작하려는 경우 약간 더 읽기 쉬운 applywith format(또는 f- 문자열과 함께 더 좋음)를 사용할 수도 있습니다.

df = pd.DataFrame({'col':['a', 0]})

df['col'] = df['col'].apply(lambda x: "{}{}".format('str', x))

또한 원하는 출력을 생성합니다.

    col
0  stra
1  str0

Python 3.6 이상을 사용하는 경우 f- 문자열을 사용할 수도 있습니다.

df['col'] = df['col'].apply(lambda x: f"str{x}")

동일한 출력을 산출합니다.

f-string 버전은 @RomanPekar의 솔루션 (python 3.6.4)만큼 빠릅니다.

df = pd.DataFrame({'col':['a', 0]*200000})

%timeit df['col'].apply(lambda x: f"str{x}")
117 ms ± 451 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

%timeit 'str' + df['col'].astype(str)
112 ms ± 1.04 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

사용 format그러나을 실제로 훨씬 느립니다.

%timeit df['col'].apply(lambda x: "{}{}".format('str', x))
185 ms ± 1.07 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

같은 결과지만, 방법 느린 ;-)
Philipp_Kats

1
@Philipp_Kats : 제안 해 주셔서 감사합니다. f- 문자열은 거의 같은 속도로 보입니다. format실제로 성능이 더 나쁩니다. 어떻게 비교 했습니까?
Cleb

오 좋아! 내 이해 .apply에 따르면 항상 "직접"벡터화 작업보다 빠르거나 느립니다. 느리지 않더라도 가능한 한 피하는 것이 좋습니다.
Philipp_Kats

@Philipp_Kats : 동의합니다.하지만이 특별한 경우에는 접미사를 추가하거나 x그 자체로 무언가를 할 때 더 읽기 쉽습니다.하지만 그것은 단지 취향의 문제입니다 ... :)
Cleb

4

pandas.Series.map 사용할 수 있습니다.

df['col'].map('str{}'.format)

모든 값 앞에 "str"이라는 단어가 적용됩니다.


3

테이블 파일을로드 dtype=str
하거나 열 유형을 문자열로 변환 df['a'] = df['a'].astype(str)
하면 다음과 같은 접근 방식을 사용할 수 있습니다.

df['a']= 'col' + df['a'].str[:]

이 접근 방식을 사용하면의 앞에 추가, 추가 및 하위 집합 문자열을 사용할 수 df있습니다.
Pandas v0.23.4, v0.24.1에서 작동합니다. 이전 버전에 대해 모릅니다.


0

.loc을 사용한 또 다른 솔루션 :

df = pd.DataFrame({'col': ['a', 0]})
df.loc[df.index, 'col'] = 'string' + df['col'].astype(str)

위의 솔루션만큼 빠르지는 않지만 (루프 당 1ms 이상 느림) 다음과 같은 조건부 변경이 필요한 경우 유용 할 수 있습니다.

mask = (df['col'] == 0)
df.loc[mask, 'col'] = 'string' + df['col'].astype(str)

.indexdf[mask].index?
AMC

.loc의 경우 데이터 프레임의 인덱스가 필요하기 때문에 @AMC. 즉, df [mask]는 조건과 일치하는 데이터 프레임을 반환하고 df [mask] .index는 데이터 프레임의 인덱스를 반환합니다. 그러나 df.loc [(df [ 'col'] == 'a'), 'col'] 또는 df.loc [mask, 'col']에서도 똑같이 할 수 있다는 것은 사실입니다.
Lukas

1
.loc의 경우 데이터 프레임의 인덱스가 필요하기 때문입니다. df.loc[mask]작동하고 작동 하면 .index불필요한 것입니다.
AMC

@AMC 정확히 :). 솔루션을 편집했습니다. 감사합니다.
Lukas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.