Kabul edilen çözüm, birçok veri için son derece yavaş olacaktır. En fazla oy sayısına sahip çözümün okunması biraz zor ve aynı zamanda sayısal verilerle yavaş. Her yeni sütun diğerlerinden bağımsız olarak hesaplanabilirse, her birini kullanmadan doğrudan atayacağım apply
.
Sahte karakter verilerine sahip örnek
Bir DataFrame içinde 100.000 dize oluşturma
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
Orijinal soruda olduğu gibi bazı metin özelliklerini çıkarmak istediğimizi varsayalım. Örneğin, ilk karakteri çıkaralım, 'e' harfinin oluşumunu sayalım ve cümleyi büyük harfle yazalım.
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
zamanlamalar
%%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)
Şaşırtıcı bir şekilde, her bir değer arasında döngü yaparak daha iyi performans elde edebilirsiniz
%%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)
Sahte sayısal veriler içeren başka bir örnek
1 milyon rastgele sayı oluşturun ve powers
fonksiyonu yukarıdan test edin .
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)
Her bir sütunu atamak 25 kat daha hızlı ve çok okunabilir:
%%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)
Burada neden apply
genellikle yolun böyle olmadığı hakkında daha fazla ayrıntı içeren benzer bir yanıt verdim.
df.ix[: ,10:16]
. Bencemerge
özelliklerinize veri setinde ihtiyacınız olacak.