TL; DR संस्करण:
के साधारण मामले के लिए:
- मेरे पास एक टेक्स्ट कॉलम है जिसमें एक सीमांकक है और मुझे दो कॉलम चाहिए
सबसे सरल उपाय है:
df['A'], df['B'] = df['AB'].str.split(' ', 1).str
या आप विभाजन के प्रत्येक प्रविष्टि के लिए एक कॉलम के साथ एक DataFrame बना सकते हैं:
df['AB'].str.split(' ', 1, expand=True)
expand=True
यदि आपके स्ट्रिंग्स में गैर-समान संख्या में विभाजन हैं और आप None
लापता मानों को बदलना चाहते हैं तो आपको इसका उपयोग करना चाहिए ।
ध्यान दें कि, किसी भी स्थिति में, .tolist()
विधि आवश्यक नहीं है। न ही है zip()
।
विस्तार से:
str.extract()
विधि की शक्ति का प्रदर्शन करने में एंडी हेडन का समाधान सबसे उत्कृष्ट है ।
लेकिन एक ज्ञात विभाजक पर एक साधारण विभाजन के लिए (जैसे, डैश द्वारा विभाजन, या व्हाट्सएप द्वारा विभाजन), .str.split()
विधि पर्याप्त 1 है । यह तारों के एक स्तंभ (श्रृंखला) पर काम करता है, और सूचियों का एक स्तंभ (श्रृंखला) लौटाता है:
>>> import pandas as pd
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2']})
>>> df
AB
0 A1-B1
1 A2-B2
>>> df['AB_split'] = df['AB'].str.split('-')
>>> df
AB AB_split
0 A1-B1 [A1, B1]
1 A2-B2 [A2, B2]
1: यदि आप अनिश्चित हैं कि पहले दो पैरामीटर .str.split()
क्या हैं, तो मैं विधि के सादे पायथन संस्करण के लिए डॉक्स सुझाता हूं ।
लेकिन तुम कैसे जाते हो:
- दो-तत्व सूचियों वाला स्तंभ
सेवा:
- सूचियों के संबंधित तत्व वाले प्रत्येक दो कॉलम?
खैर, हमें .str
एक कॉलम की विशेषता पर करीब से नज़र डालने की ज़रूरत है ।
यह एक जादुई वस्तु है जो स्तंभ में प्रत्येक तत्व को एक स्ट्रिंग के रूप में व्यवहार करने वाले तरीकों को इकट्ठा करने के लिए उपयोग किया जाता है, और फिर प्रत्येक तत्व में संबंधित विधि को यथासंभव प्रभावी रूप से लागू किया जाता है:
>>> upper_lower_df = pd.DataFrame({"U": ["A", "B", "C"]})
>>> upper_lower_df
U
0 A
1 B
2 C
>>> upper_lower_df["L"] = upper_lower_df["U"].str.lower()
>>> upper_lower_df
U L
0 A a
1 B b
2 C c
लेकिन इसके सूचकांक द्वारा स्ट्रिंग के प्रत्येक तत्व को प्राप्त करने के लिए एक "अनुक्रमणिका" इंटरफ़ेस भी है:
>>> df['AB'].str[0]
0 A
1 A
Name: AB, dtype: object
>>> df['AB'].str[1]
0 1
1 2
Name: AB, dtype: object
बेशक, यह अनुक्रमण इंटरफ़ेस .str
वास्तव में परवाह नहीं करता है यदि अनुक्रमणिका का प्रत्येक तत्व वास्तव में एक स्ट्रिंग है, जब तक कि इसे अनुक्रमणित किया जा सकता है, इसलिए:
>>> df['AB'].str.split('-', 1).str[0]
0 A1
1 A2
Name: AB, dtype: object
>>> df['AB'].str.split('-', 1).str[1]
0 B1
1 B2
Name: AB, dtype: object
फिर, यह पायथन टपल के पुनरावृत्ति का लाभ उठाने का एक सरल मामला है
>>> df['A'], df['B'] = df['AB'].str.split('-', 1).str
>>> df
AB AB_split A B
0 A1-B1 [A1, B1] A1 B1
1 A2-B2 [A2, B2] A2 B2
बेशक, स्ट्रिंग्स के एक कॉलम को विभाजित करने से डेटाफ़्रेम प्राप्त करना इतना उपयोगी है कि यह .str.split()
विधि आपके लिए expand=True
पैरामीटर के लिए कर सकती है :
>>> df['AB'].str.split('-', 1, expand=True)
0 1
0 A1 B1
1 A2 B2
इसलिए, जो हम करना चाहते थे उसे पूरा करने का एक और तरीका है:
>>> df = df[['AB']]
>>> df
AB
0 A1-B1
1 A2-B2
>>> df.join(df['AB'].str.split('-', 1, expand=True).rename(columns={0:'A', 1:'B'}))
AB A B
0 A1-B1 A1 B1
1 A2-B2 A2 B2
expand=True
संस्करण है, हालांकि लंबे समय तक, टपल खोल विधि पर एक विशिष्ट लाभ है। टपल अनपैकिंग अलग लंबाई के विभाजन के साथ अच्छी तरह से व्यवहार नहीं करता है:
>>> df = pd.DataFrame({'AB': ['A1-B1', 'A2-B2', 'A3-B3-C3']})
>>> df
AB
0 A1-B1
1 A2-B2
2 A3-B3-C3
>>> df['A'], df['B'], df['C'] = df['AB'].str.split('-')
Traceback (most recent call last):
[...]
ValueError: Length of values does not match length of index
>>>
लेकिन expand=True
इसे None
कॉलम में रखकर अच्छी तरह से संभालता है जिसके लिए पर्याप्त "विभाजन" नहीं हैं:
>>> df.join(
... df['AB'].str.split('-', expand=True).rename(
... columns={0:'A', 1:'B', 2:'C'}
... )
... )
AB A B C
0 A1-B1 A1 B1 None
1 A2-B2 A2 B2 None
2 A3-B3-C3 A3 B3 C3
read_table()
याread_fwf()