2012-09-20 13 views
29

मेरे पास एक पांडा डेटाफ्रेम में एक कॉलम है जिसे मैं एक ही स्थान पर विभाजित करना चाहता हूं। विभाजन DataFrame.str.split(' ') के साथ काफी आसान है, लेकिन मैं अंतिम प्रविष्टि से एक नया कॉलम नहीं बना सकता। जब मैं .str.split() कॉलम मुझे सरणी की एक सूची प्राप्त करता है और मुझे नहीं पता कि मेरे डेटाफ्रेम के लिए नया कॉलम प्राप्त करने के लिए इसे कैसे उपयोग किया जाए।पांडा में कॉलम पर .str.split() ऑपरेशन के बाद अंतिम "कॉलम" प्राप्त करें डेटाफ्रेम

यहां एक उदाहरण है। कॉलम में प्रत्येक प्रविष्टि में 'प्रतीक डेटा मूल्य' होता है और मैं कीमत को विभाजित करना चाहता हूं (और अंत में "पी" ... या "सी" को आधे मामलों में हटा दें)।

import pandas as pd 
temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']}) 
temp2 = temp.ticker.str.split(' ') 

जो पैदावार

0 ['spx', '5/25/2001', 'p500'] 
1 ['spx', '5/25/2001', 'p600'] 
2 ['spx', '5/25/2001', 'p700'] 

लेकिन temp2[0] सिर्फ एक सूची प्रविष्टि के सरणी देता है और temp2[:][-1] विफल रहता है। मैं प्रत्येक सरणी में अंतिम प्रविष्टि को नए कॉलम में कैसे परिवर्तित कर सकता हूं? धन्यवाद!

उत्तर

28

आप एक मध्यस्थ के रूप tolist विधि इस्तेमाल कर सकते हैं:

In [99]: import pandas as pd 

In [100]: d1 = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']}) 

In [101]: d1.ticker.str.split().tolist() 
Out[101]: 
[['spx', '5/25/2001', 'p500'], 
['spx', '5/25/2001', 'p600'], 
['spx', '5/25/2001', 'p700']] 

जिसमें से आप एक नया DataFrame कर सकता है:

:

In [102]: d2 = pd.DataFrame(d1.ticker.str.split().tolist(), 
    .....:     columns="symbol date price".split()) 

In [103]: d2 
Out[103]: 
    symbol  date price 
0 spx 5/25/2001 p500 
1 spx 5/25/2001 p600 
2 spx 5/25/2001 p700 

अच्छा उपाय के लिए, आप कीमत तय कर सकता है

In [104]: d2["price"] = d2["price"].str.replace("p","").astype(float) 

In [105]: d2 
Out[105]: 
    symbol  date price 
0 spx 5/25/2001 500 
1 spx 5/25/2001 600 
2 spx 5/25/2001 700 

पीएस: लेकिन यदि आप वास्तव में अभी पिछले स्तंभ चाहते हैं, apply पर्याप्त होगा:

In [113]: temp2.apply(lambda x: x[2]) 
Out[113]: 
0 p500 
1 p600 
2 p700 
Name: ticker 
+0

यह सिर्फ मुझे पांडा में एक लॉग फ़ाइल जोड़ने में मदद करता है जो बहुत डरावना और गन्दा था (प्रति पंक्ति बहुत सारी जानकारी वाले डेटा के एकल कॉलम)। – trench

+0

वेस मैककिनी के जवाब की तुलना में इन सभी दृष्टिकोणों में विनाशकारी प्रदर्शन है। –

+1

@ जोहानज़विन: वाह, कार्यक्षमता के बारे में पांच वर्षीय उत्तर पर एक प्रदर्शन-केवल संबंधित डाउनवोट जिसे केवल [दो महीने पहले] के बारे में पेश किया गया था (https://github.com/pandas-dev/pandas/issues/1656)? वह है .. कठोर, मैं तुम्हें वह दूंगा! – DSM

49

यह करें:

In [43]: temp2.str[-1] 
Out[43]: 
0 p500 
1 p600 
2 p700 
Name: ticker 
+3

स्वच्छ समाधान से प्यार करें! "पांडस" के लेखक से – ericmjl

+4

:) – kmonsoor

+3

मुझे इस समाधान से प्यार है, लेकिन यह कैसे काम करता है? मतलब, "दृश्यों के पीछे" क्या हो रहा है जो सूची से विशिष्ट तत्व का चयन करने के लिए 'str' के बाद ब्रैकेट्स को अनुमति देता है? –

0

पांडा 0.20.3 का उपयोग करना:

In [10]: import pandas as pd 
    ...: temp = pd.DataFrame({'ticker' : ['spx 5/25/2001 p500', 'spx 5/25/2001 p600', 'spx 5/25/2001 p700']}) 
    ...: 

In [11]: temp2 = temp.ticker.str.split(' ', expand=True) # the expand=True return a DataFrame 

In [12]: temp2 
Out[12]: 
    0   1  2 
0 spx 5/25/2001 p500 
1 spx 5/25/2001 p600 
2 spx 5/25/2001 p700 

In [13]: temp3 = temp.join(temp2[2]) 

In [14]: temp3 
Out[14]: 
       ticker  2 
0 spx 5/25/2001 p500 p500 
1 spx 5/25/2001 p600 p600 
2 spx 5/25/2001 p700 p700 
संबंधित मुद्दे