2013-04-11 6 views
11

मैं एक पांडा dataframe है कि इस तरह दिखता है में पांडा में पंक्तियाँ, आइटम के आधार पर नकल करने के लिए:एक सूची

COL  data 
line1 [A,B,C] 

जहां डाटा कॉलम के आइटम या तो एक सूची हो सकता है या सिर्फ अल्पविराम तत्वों अलग । वहाँ है एक आसान होने का तरीका है:

COL  data 
line1 A 
line1 B 
line1 C 

मैं सूची पर पुनरावृति सकता है और मैन्युअल रूप से अजगर के माध्यम से पंक्तियों नकल, लेकिन वहाँ ऐसा करने के लिए कुछ जादू पांडा चाल है? मुख्य बिंदु यह है कि पंक्तियों को स्वचालित रूप से डुप्लिकेट कैसे करें।

धन्यवाद!

उत्तर

6

आप इसे एक सूची बनाने के लिए एक सरल सफाई समारोह लिख सकता है (यह मानते हुए यह अल्पविराम के की एक सूची नहीं है, और आप बस ast.literal_eval उपयोग नहीं कर सकते):

पंक्तियों के माध्यम से
def clean_string_to_list(s): 
    return [c for c in s if c not in '[,]'] # you might need to catch errors 

df['data'] = df['data'].apply(clean_string_to_list) 

पुनरावृत्ति एक उचित की तरह लगता है पसंद:

In [11]: pd.DataFrame([(row['COL'], d) 
         for d in row['data'] 
         for _, row in df.iterrows()], 
         columns=df.columns) 
Out[11]: 
    COL data 
0 line1 A 
1 line1 B 
2 line1 C 

मुझे डर है कि मैं पांडा नहीं लगता कि कर रहा हूँ हेरफेर के इस प्रकार के लिए विशेष रूप पूरा करता है।

+0

"पंक्ति" और "पंक्ति ['COL']" कहां से आती है? –

+0

@AlexanderSupertramp सूची समझ के अंदर '_ के लिए, df.iterrows में पंक्ति()'। _ पंक्ति की अनुक्रमणिका है, पंक्ति सीएफ के रूप में डीएफ की पंक्ति है। –

+4

यह मेरे लिए लिखित रूप में काम नहीं किया; मुझे दो 'के लिए' स्विच करने की आवश्यकता है: '[(पंक्ति ['COL'], डी) _ के लिए, पंक्ति में df.iterrows() में पंक्ति ['डेटा']]'। – RafG