2015-03-31 12 views
22

में कॉलम में टुपल्स में स्प्लिट स्ट्रिंग्स मेरे पास निम्नलिखित DataFrame है, जहां Track ID पंक्ति अनुक्रमणिका है। मैं स्ट्रिंग को stats कॉलम में संख्याओं के 5 कॉलम में कैसे विभाजित कर सकता हूं?पांडस

Track ID stats 
14.0 (-0.00924175824176, 0.41, -0.742016492568, 0.0036830094242, 0.00251748449963) 
28.0 (0.0411538461538, 0.318230769231, 0.758717081514, 0.00264000622468, 0.0106535783677) 
42.0 (-0.0144351648352, 0.168438461538, -0.80870348637, 0.000816872566404, 0.00316572586742) 
56.0 (0.0343461538462, 0.288730769231, 0.950844962874, 6.1608706775e-07, 0.00337262030771) 
70.0 (0.00905164835165, 0.151030769231, 0.670257006716, 0.0121790506745, 0.00302182567957) 
84.0 (-0.0047967032967, 0.171615384615, -0.552879463981, 0.0500316517755, 0.00217970256969) 
+0

आप स्ट्रिंग प्रस्तुति के बजाय डेटाफ्रेम के df.to_dict() को पोस्ट करके दूसरों के लिए चीजों को बहुत आसान बना देंगे। – chthonicdaemon

+1

आँकड़े कॉलम, क्या इसमें एक स्ट्रिंग होती है जो टुपल की तरह दिखती है, या इसमें टुपल्स हैं? – joris

+0

संभावित "डुप्लिकेट" जोड़ी सरणी की श्रृंखला "को" दो कॉलम डेटाफ्रेम "में परिवर्तित करें?] (Http://stackoverflow.com/questions/29346512/convert-a-pandas-series-of-pair-arrays -एक-दो-कॉलम-डेटाफ्रेम) – TheBlackCat

उत्तर

43

और अन्य मामले के लिए, यह मानते हुए यह तार कि tuples की तरह लग रहे हैं:

In [74]: df['stats'].str[1:-1].str.split(',', expand=True).astype(float) 
Out[74]: 
      0   1   2   3   4 
0 -0.009242 0.410000 -0.742016 0.003683 0.002517 
1 0.041154 0.318231 0.758717 0.002640 0.010654 
2 -0.014435 0.168438 -0.808703 0.000817 0.003166 
3 0.034346 0.288731 0.950845 0.000001 0.003373 
4 0.009052 0.151031 0.670257 0.012179 0.003022 
5 -0.004797 0.171615 -0.552879 0.050032 0.002180 

(ध्यान दें: पांडा (< 0.16.1) के पुराने संस्करणों के लिए, आप कीवर्ड का विस्तार करने के बजाय return_type='frame' उपयोग करने की आवश्यकता),

वैसे अगर यह tuples और तार नहीं, आप कर सकते हैं कर रहे हैं बस निम्न कार्य करें:

df['stats'].apply(pd.Series) 

यह पिछले एक भी ऊपर के साथ जोड़ा जा सकता है (अगर return_type='frame' अभी उपलब्ध नहीं है):

df['stats'].str[1:-1].str.split(',').apply(pd.Series).astype(float) 
+0

इनपुट के लिए धन्यवाद। मैं सामान्य रूप से पांडा, पायथन और स्क्रिप्टिंग के लिए नया हूं, इसलिए अभी भी मूल बातें के आसपास अपना सिर मिल रहा हूं। 'आंकड़े' कॉलम में डेटा वास्तव में tuples थे। 'Df2 = df ['stats'] के साथ एक नया डेटाफ्रेम बनाना। लागू करें (pd.Series) 'ने मुझे आगे बढ़ाया है। एक बार फिर धन्यवाद। –

+6

'return_type' को' विस्तार = सही' के पक्ष में बहिष्कृत कर दिया गया है। – tacaswell

+0

इच्छा है कि मैं इसे फिर से उठा सकता हूं – Private

0

मान लें कि आप एक स्तंभ जो tuples शामिल है बल्कि तार से (के रूप में यह अपने उदाहरण में प्रकट होता है), इस काम करेगा:

df = pandas.DataFrame({'Track ID': [14, 28, 42], 'stats': [(1, 2, 3, 4, 5), (1, 2, 3, 4, 5), (1, 2, 3, 4, 5)]}).set_index("Track ID") 

from operator import itemgetter 
for i in range(5): 
    df["Col {}".format(i)] = df.stats.apply(itemgetter(i)) 

आप वास्तव में तार कि tuples की तरह लग रही है, तो आप कर सकते हैं उन्हें पहली पार्स और फिर एक ही पैटर्न लागू के रूप में ऊपर:

df = df2 = pandas.DataFrame({'Track ID': [14, 28, 42], 'stats': ["(1, 2, 3, 4, 5)", "(1, 2, 3, 4, 5)", "(1, 2, 3, 4, 5)"]}).set_index("Track ID") 
df.stats = df2.stats.str.strip("()").str.split(", ") 
1

आप tuples और तार नहीं का एक क्रम है, और आप उन्हें DataFrame स्तंभों के रूप में चाहते हैं, यह सबसे सरल तरीका है:

df = pd.concat([df['Track ID'],pd.DataFrame(df['stats'].values.tolist())], axis=1) 

यदि यह वास्तव में तार है, तो आपको पहले तो जैसे सूचियों को रूपांतरित कर सकते हैं, फिर उपरोक्त ऑपरेशन लागू करें:

dfpart = pd.DataFrame(df['stats'].apply(lambda x: x.strip('()').split(', ')).values.tolist()).astype(float) 
df = pd.concat([df['Track ID'], dfpart], axis=1)