स्वीकृत समाधान बहुत सारे डेटा के लिए बहुत धीमा होने वाला है। सबसे बड़ी संख्या में उत्थान के साथ समाधान पढ़ना थोड़ा मुश्किल है और संख्यात्मक डेटा के साथ भी धीमा है। यदि प्रत्येक नए स्तंभ की गणना दूसरों से स्वतंत्र रूप से की जा सकती है, तो मैं उनमें से प्रत्येक को बिना उपयोग किए सीधे असाइन करूंगा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)
नकली संख्यात्मक डेटा के साथ एक और उदाहरण
1 मिलियन यादृच्छिक संख्या बनाएं और 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)
प्रत्येक स्तंभ को असाइन करना 25x तेज और बहुत पठनीय है:
%%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
डेटासेट में अपनी सुविधाओं के लिए जाना होगा ।