수용되는 솔루션은 많은 데이터에 대해 매우 느릴 것입니다. 공감 수가 가장 많은 솔루션은 읽기가 약간 어렵고 숫자 데이터의 경우 속도가 느립니다. 각각의 새 열을 다른 열과 독립적으로 계산할 수 있다면 사용하지 않고 각 열을 직접 할당합니다.apply
.
가짜 문자 데이터의 예
DataFrame에서 100,000 개의 문자열 만들기
df = pd.DataFrame(np.random.choice(['he jumped', 'she ran', 'they hiked'],
size=100000, replace=True),
columns=['words'])
df.head()
words
0 she ran
1 she ran
2 they hiked
3 they hiked
4 they hiked
원래 질문에서와 같이 일부 텍스트 기능을 추출하고 싶다고 가정 해 봅시다. 예를 들어 첫 번째 문자를 추출하고 문자 'e'의 발생 횟수를 세고 구를 대문자로 만들어 봅시다.
df['first'] = df['words'].str[0]
df['count_e'] = df['words'].str.count('e')
df['cap'] = df['words'].str.capitalize()
df.head()
words first count_e cap
0 she ran s 1 She ran
1 she ran s 1 She ran
2 they hiked t 2 They hiked
3 they hiked t 2 They hiked
4 they hiked t 2 They hiked
타이밍
%%timeit
df['first'] = df['words'].str[0]
df['count_e'] = df['words'].str.count('e')
df['cap'] = df['words'].str.capitalize()
127 ms ± 585 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
def extract_text_features(x):
return x[0], x.count('e'), x.capitalize()
%timeit df['first'], df['count_e'], df['cap'] = zip(*df['words'].apply(extract_text_features))
101 ms ± 2.96 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
놀랍게도 각 값을 반복하여 더 나은 성능을 얻을 수 있습니다
%%timeit
a,b,c = [], [], []
for s in df['words']:
a.append(s[0]), b.append(s.count('e')), c.append(s.capitalize())
df['first'] = a
df['count_e'] = b
df['cap'] = c
79.1 ms ± 294 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
가짜 숫자 데이터가있는 다른 예
백만 개의 난수를 만들고 powers
위에서 함수를 테스트하십시오 .
df = pd.DataFrame(np.random.rand(1000000), columns=['num'])
def powers(x):
return x, x**2, x**3, x**4, x**5, x**6
%%timeit
df['p1'], df['p2'], df['p3'], df['p4'], df['p5'], df['p6'] = \
zip(*df['num'].map(powers))
1.35 s ± 83.6 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
각 열을 할당하는 것이 25 배 더 빠르고 읽기 쉽습니다.
%%timeit
df['p1'] = df['num'] ** 1
df['p2'] = df['num'] ** 2
df['p3'] = df['num'] ** 3
df['p4'] = df['num'] ** 4
df['p5'] = df['num'] ** 5
df['p6'] = df['num'] ** 6
51.6 ms ± 1.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
나는 왜 일반적으로 갈 길이 아닌지에 대해 더 자세한 내용 으로 비슷한 대답을했습니다 apply
.
df.ix[: ,10:16]
.merge
데이터 세트에 기능 이 있어야한다고 생각합니다 .