Solusi yang diterima akan sangat lambat untuk banyak data. Solusi dengan jumlah upvote terbesar agak sulit dibaca dan juga lambat dengan data numerik. Jika setiap kolom baru dapat dihitung secara independen dari yang lain, saya hanya akan menetapkan masing-masing secara langsung tanpa menggunakan apply
.
Contoh dengan data karakter palsu
Buat 100.000 string dalam DataFrame
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
Katakanlah kita ingin mengekstraksi beberapa fitur teks seperti yang dilakukan pada pertanyaan awal. Misalnya, mari kita ekstrak karakter pertama, hitung kemunculan huruf 'e' dan gunakan huruf besar frase.
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
Pengaturan waktu
%%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)
Anehnya, Anda bisa mendapatkan kinerja yang lebih baik dengan mengulang setiap nilai
%%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)
Contoh lain dengan data numerik palsu
Buat 1 juta angka acak dan uji powers
fungsi dari atas.
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)
Menetapkan setiap kolom 25x lebih cepat dan sangat mudah dibaca:
%%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)
Saya membuat respons serupa dengan lebih detail di sini tentang mengapa apply
biasanya bukan cara untuk pergi.
df.ix[: ,10:16]
. Saya pikir Anda harus memilikimerge
fitur Anda ke dalam dataset.