दिलचस्प पोस्ट
एएसपी.नेट पहचान डीबीसीटीएक्सटीक्स भ्रम Jquery.js और jquery.min.js के बीच अंतर क्या है? क्या जावास्क्रिप्ट संपत्ति नामों में डैश की अनुमति है? जावास्क्रिप्ट में "अमान्य तारीख" दिनांक उदाहरण का पता लगाया जा रहा है जेएसपी पर एपॉरोपि या उद्धरण से बचने के लिए कैसे (जावास्क्रिप्ट द्वारा उपयोग किया जाता है) मैं गिट के लिए सब्लाइम टेक्स्ट को डिफ़ॉल्ट संपादक कैसे बना सकता हूं? परीक्षण करें कि कोई प्रॉपर्टी डायनामिक चर पर उपलब्ध है एक NumPy बहुआयामी सरणी के ith कॉलम तक कैसे पहुंचें? FileSystemWatcher बनाम मतदान में परिवर्तन के लिए देखने के लिए MySQL और PHP: सीरिलिक वर्णों के साथ यूटीएफ -8 Guzzlehttp – कैसे गजले 6 से प्रतिक्रिया का शरीर मिलता है? जेनमेन इटैम का नाम ऐक्शन लास्टनर को देना Angularjs: 'नियंत्रक के रूप में नियंत्रक' और $ घड़ी कैसे स्प्रिंग अनुप्रयोग में सिस्टम पर्यावरण चर को पढ़ने के लिए कैसे एक स्ट्रिंग को एक nullable int में पार्स करने के लिए

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

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

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. 

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

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

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

 >>> 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)})