दिलचस्प पोस्ट
आप C ++ के साथ एक HTTP अनुरोध कैसे करते हैं? क्या ffmpeg एक प्रगति बार दिखा सकता है? क्या ओरेकल डेटाबेस में एक बूलीयन प्रकार है? प्रवेश टोकन का उपयोग करके फेसबुक उपयोगकर्ता आईडी कैसे प्राप्त करें एक php पृष्ठ पर त्रुटियों को संभालने का सबसे अच्छा तरीका है? पा गणना (ए, बी) मॉड n कस्टम विधानसभा विशेषताएं आपके गणितिका उपकरण बैग में क्या है? एक स्ट्रिंग में उसका नाम दिया गया एक चर का मान कैसे प्राप्त करें? विजेट से गतिविधि शुरू करना टूलबार के नीचे नेविगेशन ड्रॉवर पॉलीमर के साथ एक टेम्पलेट में HTML इंजेक्षन कैसे करें एंड्रॉइड कैसे रनटाइम थंबनेल बनाने के लिए चाल चलाना w / websockets और अजगर / डीजेंगो (/ मुड़?) क्या स्वयं को बंद करने वाला डीआईवी टैग इस्तेमाल करना ठीक है?

पांडा: जब सेल की सामग्री सूचियां हैं, तो सूची में प्रत्येक तत्व के लिए एक पंक्ति बनाएं

मेरे पास डेटाफ़्रेम है जहां कुछ कक्षों में एकाधिक मानों की सूची होती है। एक सेल में एकाधिक मानों को संग्रहीत करने के बजाय, मैं डेटाफ़्रेम का विस्तार करना चाहता हूं ताकि सूची में प्रत्येक आइटम अपनी ही पंक्ति हो (सभी अन्य स्तंभों में समान मूल्यों के साथ)। इसलिए यदि मेरे पास है:

import pandas as pd import numpy as np df = pd.DataFrame( {'trial_num': [1, 2, 3, 1, 2, 3], 'subject': [1, 1, 1, 2, 2, 2], 'samples': [list(np.random.randn(3).round(2)) for i in range(6)] } ) df Out[10]: samples subject trial_num 0 [0.57, -0.83, 1.44] 1 1 1 [-0.01, 1.13, 0.36] 1 2 2 [1.18, -1.46, -0.94] 1 3 3 [-0.08, -4.22, -2.05] 2 1 4 [0.72, 0.79, 0.53] 2 2 5 [0.4, -0.32, -0.13] 2 3 

मैं लंबे समय के रूप में कैसे परिवर्तित करूं, जैसे:

  subject trial_num sample sample_num 0 1 1 0.57 0 1 1 1 -0.83 1 2 1 1 1.44 2 3 1 2 -0.01 0 4 1 2 1.13 1 5 1 2 0.36 2 6 1 3 1.18 0 # etc. 

सूचकांक जरूरी नहीं है, सूचकांक के रूप में मौजूदा कॉलम सेट करना ठीक है और अंतिम क्रम महत्वपूर्ण नहीं है।

Solutions Collecting From Web of "पांडा: जब सेल की सामग्री सूचियां हैं, तो सूची में प्रत्येक तत्व के लिए एक पंक्ति बनाएं"

मुझे उम्मीद की तुलना में थोड़ा अधिक समय:

 >>> df samples subject trial_num 0 [-0.07, -2.9, -2.44] 1 1 1 [-1.52, -0.35, 0.1] 1 2 2 [-0.17, 0.57, -0.65] 1 3 3 [-0.82, -1.06, 0.47] 2 1 4 [0.79, 1.35, -0.09] 2 2 5 [1.17, 1.14, -1.79] 2 3 >>> >>> s = df.apply(lambda x: pd.Series(x['samples']),axis=1).stack().reset_index(level=1, drop=True) >>> s.name = 'sample' >>> >>> df.drop('samples', axis=1).join(s) subject trial_num sample 0 1 1 -0.07 0 1 1 -2.90 0 1 1 -2.44 1 1 2 -1.52 1 1 2 -0.35 1 1 2 0.10 2 1 3 -0.17 2 1 3 0.57 2 1 3 -0.65 3 2 1 -0.82 3 2 1 -1.06 3 2 1 0.47 4 2 2 0.79 4 2 2 1.35 4 2 2 -0.09 5 2 3 1.17 5 2 3 1.14 5 2 3 -1.79 

यदि आप अनुक्रमिक सूचकांक चाहते हैं, तो आप परिणाम के लिए reset_index(drop=True) लागू कर सकते हैं।

अपडेट करें :

 >>> res = df.set_index(['subject', 'trial_num'])['samples'].apply(pd.Series).stack() >>> res = res.reset_index() >>> res.columns = ['subject','trial_num','sample_num','sample'] >>> res subject trial_num sample_num sample 0 1 1 0 1.89 1 1 1 1 -2.92 2 1 1 2 0.34 3 1 2 0 0.85 4 1 2 1 0.24 5 1 2 2 0.72 6 1 3 0 -0.96 7 1 3 1 -2.72 8 1 3 2 -0.11 9 2 1 0 -1.33 10 2 1 1 3.13 11 2 1 2 -0.65 12 2 2 0 0.10 13 2 2 1 0.65 14 2 2 2 0.15 15 2 3 0 0.64 16 2 3 1 -0.10 17 2 3 2 -0.76 

आप इसके लिए pd.concat और pd.melt भी उपयोग कर सकते हैं:

 >>> objs = [df, pd.DataFrame(df['samples'].tolist())] >>> pd.concat(objs, axis=1).drop('samples', axis=1) subject trial_num 0 1 2 0 1 1 -0.49 -1.00 0.44 1 1 2 -0.28 1.48 2.01 2 1 3 -0.52 -1.84 0.02 3 2 1 1.23 -1.36 -1.06 4 2 2 0.54 0.18 0.51 5 2 3 -2.18 -0.13 -1.35 >>> pd.melt(_, var_name='sample_num', value_name='sample', ... value_vars=[0, 1, 2], id_vars=['subject', 'trial_num']) subject trial_num sample_num sample 0 1 1 0 -0.49 1 1 2 0 -0.28 2 1 3 0 -0.52 3 2 1 0 1.23 4 2 2 0 0.54 5 2 3 0 -2.18 6 1 1 1 -1.00 7 1 2 1 1.48 8 1 3 1 -1.84 9 2 1 1 -1.36 10 2 2 1 0.18 11 2 3 1 -0.13 12 1 1 2 0.44 13 1 2 2 2.01 14 1 3 2 0.02 15 2 1 2 -1.06 16 2 2 2 0.51 17 2 3 2 -1.35 

आखिरकार, अगर आपको पहले तीन स्तंभों के आधार पर पहले सॉर्ट किया जा सकता है।

इसे बेहतर समझने के लिए रोमन पेकर के समाधान के चरण-दर-चरण के माध्यम से काम करने की कोशिश करते हुए, मैं अपने स्वयं के समाधान के साथ आया था, जो कुछ भ्रामक स्टैकिंग और इंडेक्स रीसेटिंग से बचने के लिए melt का उपयोग करता है। मैं यह नहीं कह सकता कि यह स्पष्ट रूप से एक स्पष्ट समाधान है:

 items_as_cols = df.apply(lambda x: pd.Series(x['samples']), axis=1) # Keep original df index as a column so it's retained after melt items_as_cols['orig_index'] = items_as_cols.index melted_items = pd.melt(items_as_cols, id_vars='orig_index', var_name='sample_num', value_name='sample') melted_items.set_index('orig_index', inplace=True) df.merge(melted_items, left_index=True, right_index=True) 

आउटपुट (जाहिर है हम अब मूल नमूने कॉलम ड्रॉप कर सकते हैं):

  samples subject trial_num sample_num sample 0 [1.84, 1.05, -0.66] 1 1 0 1.84 0 [1.84, 1.05, -0.66] 1 1 1 1.05 0 [1.84, 1.05, -0.66] 1 1 2 -0.66 1 [-0.24, -0.9, 0.65] 1 2 0 -0.24 1 [-0.24, -0.9, 0.65] 1 2 1 -0.90 1 [-0.24, -0.9, 0.65] 1 2 2 0.65 2 [1.15, -0.87, -1.1] 1 3 0 1.15 2 [1.15, -0.87, -1.1] 1 3 1 -0.87 2 [1.15, -0.87, -1.1] 1 3 2 -1.10 3 [-0.8, -0.62, -0.68] 2 1 0 -0.80 3 [-0.8, -0.62, -0.68] 2 1 1 -0.62 3 [-0.8, -0.62, -0.68] 2 1 2 -0.68 4 [0.91, -0.47, 1.43] 2 2 0 0.91 4 [0.91, -0.47, 1.43] 2 2 1 -0.47 4 [0.91, -0.47, 1.43] 2 2 2 1.43 5 [-1.14, -0.24, -0.91] 2 3 0 -1.14 5 [-1.14, -0.24, -0.91] 2 3 1 -0.24 5 [-1.14, -0.24, -0.91] 2 3 2 -0.91 

उन लोगों के लिए जो रोमन पेकर के उत्तर के एक संस्करण की खोज करते हैं जो मैन्युअल कॉलम नामकरण से बचा जाता है:

 column_to_explode = 'samples' res = (df .set_index([x for x in df.columns if x != column_to_explode])[column_to_explode] .apply(pd.Series) .stack() .reset_index()) res = res.rename(columns={ res.columns[-2]:'exploded_{}_index'.format(column_to_explode), res.columns[-1]: '{}_exploded'.format(column_to_explode)})