str
एक्सेसर कि के लिए उपलब्ध है pandas.Series
की वस्तुओं dtype == object
वास्तव में एक iterable है।
मान लें pandas.DataFrame
df
:
df = pd.DataFrame(dict(col=[*zip('abcdefghij', range(10, 101, 10))]))
df
col
0 (a, 10)
1 (b, 20)
2 (c, 30)
3 (d, 40)
4 (e, 50)
5 (f, 60)
6 (g, 70)
7 (h, 80)
8 (i, 90)
9 (j, 100)
हम परीक्षण कर सकते हैं अगर यह एक चलने योग्य है
from collections import Iterable
isinstance(df.col.str, Iterable)
True
हम इसे तब से असाइन कर सकते हैं जैसे हम अन्य पुनरावृत्तियाँ करते हैं:
var0, var1 = 'xy'
print(var0, var1)
x y
सबसे सरल उपाय
तो एक पंक्ति में हम दोनों कॉलम असाइन कर सकते हैं
df['a'], df['b'] = df.col.str
df
col a b
0 (a, 10) a 10
1 (b, 20) b 20
2 (c, 30) c 30
3 (d, 40) d 40
4 (e, 50) e 50
5 (f, 60) f 60
6 (g, 70) g 70
7 (h, 80) h 80
8 (i, 90) i 90
9 (j, 100) j 100
तेजी से समाधान
केवल थोड़ा और जटिल, हम zip
एक समान चलने योग्य बनाने के लिए उपयोग कर सकते हैं
df['c'], df['d'] = zip(*df.col)
df
col a b c d
0 (a, 10) a 10 a 10
1 (b, 20) b 20 b 20
2 (c, 30) c 30 c 30
3 (d, 40) d 40 d 40
4 (e, 50) e 50 e 50
5 (f, 60) f 60 f 60
6 (g, 70) g 70 g 70
7 (h, 80) h 80 h 80
8 (i, 90) i 90 i 90
9 (j, 100) j 100 j 100
पंक्ति में
मतलब, मौजूदा को म्यूट न करें df
क्योंकि यह काम करता है क्योंकि assign
कीवर्ड तर्क लेता है जहां कीवर्ड नए (या मौजूदा) कॉलम नाम हैं और मान नए कॉलम के मान होंगे। आप एक डिक्शनरी का उपयोग कर सकते हैं और इसे अनपैक कर सकते हैं **
और यह कीवर्ड तर्क के रूप में कार्य कर सकता है। तो यह एक नया कॉलम असाइन करने का एक चतुर तरीका है जिसका नाम 'g'
है, जो df.col.str
पुनरावृत्त में पहला आइटम है और 'h'
जो पुनरावृत्त में दूसरा आइटम है df.col.str
।
df.assign(**dict(zip('gh', df.col.str)))
col g h
0 (a, 10) a 10
1 (b, 20) b 20
2 (c, 30) c 30
3 (d, 40) d 40
4 (e, 50) e 50
5 (f, 60) f 60
6 (g, 70) g 70
7 (h, 80) h 80
8 (i, 90) i 90
9 (j, 100) j 100
का मेरा संस्करण list
दृष्टिकोण
आधुनिक सूची की समझ और चर unpacking के साथ।
नोट: इनलाइन का उपयोग करjoin
df.join(pd.DataFrame([*df.col], df.index, [*'ef']))
col g h
0 (a, 10) a 10
1 (b, 20) b 20
2 (c, 30) c 30
3 (d, 40) d 40
4 (e, 50) e 50
5 (f, 60) f 60
6 (g, 70) g 70
7 (h, 80) h 80
8 (i, 90) i 90
9 (j, 100) j 100
उत्परिवर्तन संस्करण होगा
df[['e', 'f']] = pd.DataFrame([*df.col], df.index)
Naive Time Test
लघु डेटाफ़्रेम
ऊपर परिभाषित एक का उपयोग करें
%timeit df.assign(**dict(zip('gh', df.col.str)))
%timeit df.assign(**dict(zip('gh', zip(*df.col))))
%timeit df.join(pd.DataFrame([*df.col], df.index, [*'gh']))
1.16 ms ± 21.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
635 µs ± 18.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
795 µs ± 42.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
लंबा डाटाफ़्रेम
10 ^ 3 गुना बड़ा
df = pd.concat([df] * 1000, ignore_index=True)
%timeit df.assign(**dict(zip('gh', df.col.str)))
%timeit df.assign(**dict(zip('gh', zip(*df.col))))
%timeit df.join(pd.DataFrame([*df.col], df.index, [*'gh']))
11.4 ms ± 1.53 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.1 ms ± 41.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2.33 ms ± 35.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)