이 질문은 이미 답변되었지만 이전에 논의되지 않은 유용한 방법을 혼합하여 지금까지 제안한 모든 방법을 성능 측면에서 비교하는 것이 좋을 것이라고 생각합니다.
성능 순서를 높이기 위해이 문제에 대한 몇 가지 유용한 솔루션이 있습니다.
이것은 간단한 str.format
기반 접근 방식입니다.
df['baz'] = df.agg('{0[bar]} is {0[foo]}'.format, axis=1)
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
여기에서 f- 문자열 형식을 사용할 수도 있습니다.
df['baz'] = df.agg(lambda x: f"{x['bar']} is {x['foo']}", axis=1)
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
열을로 연결하도록 변환 chararrays
한 다음 함께 추가합니다.
a = np.char.array(df['bar'].values)
b = np.char.array(df['foo'].values)
df['baz'] = (a + b' is ' + b).astype(str)
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
팬더에서 목록 이해력이 얼마나 과소 평가되었는지 과소 평가할 수 없습니다.
df['baz'] = [str(x) + ' is ' + y for x, y in zip(df['bar'], df['foo'])]
또는을 사용 str.join
하여 연결합니다 (확장도 향상됨).
df['baz'] = [
' '.join([str(x), 'is', y]) for x, y in zip(df['bar'], df['foo'])]
df
foo bar baz
0 a 1 1 is a
1 b 2 2 is b
2 c 3 3 is c
문자열 연산은 본질적으로 벡터화하기 어렵고 대부분의 pandas "벡터화 된"함수는 기본적으로 루프를 둘러싼 래퍼이기 때문에 목록 이해는 문자열 조작에 탁월합니다. 판다를 사용한 For 루프 에서이 주제에 대해 광범위하게 작성했습니다. 언제 관심을 가져야합니까? . 일반적으로 인덱스 정렬에 대해 걱정할 필요가 없으면 문자열 및 정규식 작업을 처리 할 때 목록 이해를 사용하십시오.
위의 목록 구성은 기본적으로 NaN을 처리하지 않습니다. 그러나 처리해야하는 경우 항상 try-except를 래핑하는 함수를 작성할 수 있습니다.
def try_concat(x, y):
try:
return str(x) + ' is ' + y
except (ValueError, TypeError):
return np.nan
df['baz'] = [try_concat(x, y) for x, y in zip(df['bar'], df['foo'])]
perfplot
성능 측정
perfplot을 사용하여 생성 된 그래프 . 다음은 전체 코드 목록 입니다.
기능
def brenbarn(df):
return df.assign(baz=df.bar.map(str) + " is " + df.foo)
def danielvelkov(df):
return df.assign(baz=df.apply(
lambda x:'%s is %s' % (x['bar'],x['foo']),axis=1))
def chrimuelle(df):
return df.assign(
baz=df['bar'].astype(str).str.cat(df['foo'].values, sep=' is '))
def vladimiryashin(df):
return df.assign(baz=df.astype(str).apply(lambda x: ' is '.join(x), axis=1))
def erickfis(df):
return df.assign(
baz=df.apply(lambda x: f"{x['bar']} is {x['foo']}", axis=1))
def cs1_format(df):
return df.assign(baz=df.agg('{0[bar]} is {0[foo]}'.format, axis=1))
def cs1_fstrings(df):
return df.assign(baz=df.agg(lambda x: f"{x['bar']} is {x['foo']}", axis=1))
def cs2(df):
a = np.char.array(df['bar'].values)
b = np.char.array(df['foo'].values)
return df.assign(baz=(a + b' is ' + b).astype(str))
def cs3(df):
return df.assign(
baz=[str(x) + ' is ' + y for x, y in zip(df['bar'], df['foo'])])