2015-10-07 7 views
5

जब पांडा DataFrame को ढेर करते हैं, तो Series वापस आ जाता है। आम तौर पर जब मैं DataFrame ढेर करता हूं, तो मैं इसे वापस DataFrame में परिवर्तित करता हूं। हालांकि, स्टैक्ड डेटा से आने वाले डिफ़ॉल्ट नाम कॉलम को थोड़ा हैकी का नाम बदलते हैं। मैं जो खोज रहा हूं वह स्टैकिंग के बाद कॉलम समझदार नाम देने के लिए एक आसान/अंतर्निहित तरीका है।पांडों को ढेर करते समय कॉलम नाम सेट करें डेटाफ्रेम

जैसे, के लिए निम्नलिखित DataFrame:

In [64]: df = pd.DataFrame({'id':[1,2,3], 
    ...:     'date':['2015-09-31']*3, 
    ...:     'value':[100, 95, 42], 
    ...:     'value2':[200, 57, 27]}).set_index(['id','date']) 

In [65]: df 
Out[65]: 
       value value2 
id date      
1 2015-09-31 100  200 
2 2015-09-31  95  57 
3 2015-09-31  42  27 

मैं ढेर और इसे वापस कन्वर्ट करने के लिए एक DataFrame तो जैसे:

In [68]: df.stack().reset_index() 
Out[68]: 
    id  date level_2 0 
0 1 2015-09-31 value 100 
1 1 2015-09-31 value2 200 
2 2 2015-09-31 value 95 
3 2 2015-09-31 value2 57 
4 3 2015-09-31 value 42 
5 3 2015-09-31 value2 27 

तो आदेश मैं ऐसा करने की आवश्यकता होगी उचित रूप से इन स्तंभों में नाम के लिए इस तरह कुछ:

In [72]: stacked = df.stack() 

In [73]: stacked 
Out[73]: 
id date    
1 2015-09-31 value  100 
       value2 200 
2 2015-09-31 value  95 
       value2  57 
3 2015-09-31 value  42 
       value2  27 
dtype: int64 

In [74]: stacked.index.set_names('var_name', level=len(stacked.index.names)-1, inplace=True) 

In [88]: stacked.reset_index().rename(columns={0:'value'}) 
Out[88]: 
    id  date var_name value 
0 1 2015-09-31 value 100 
1 1 2015-09-31 value2 200 
2 2 2015-09-31 value  95 
3 2 2015-09-31 value2  57 
4 3 2015-09-31 value  42 
5 3 2015-09-31 value2  27 

आदर्श रूप से,

df.stack(new_index_name='var_name', new_col_name='value') 

लेकिन docs को देखकर यह नहीं लगता है stack किसी भी तरह के तर्क लेता है की तरह: समाधान कुछ इस तरह दिखेगा। क्या इस वर्कफ़्लो से निपटने के लिए पांडा में एक आसान/अंतर्निहित तरीका है?

उत्तर

5

pd.melt अक्सर "विस्तृत" से "लंबे" प्रारूप करने के लिए DataFrames परिवर्तित करने के लिए उपयोगी है। आप यहाँ pd.melt इस्तेमाल कर सकते हैं अगर आप स्तंभों को id और date सूचकांक का स्तर परिवर्तित पहले:

In [56]: pd.melt(df.reset_index(), id_vars=['id', 'date'], value_vars=['value', 'value2'], var_name='var_name', value_name='value') 
Out[56]: 
    id  date var_name value 
0 1 2015-09-31 value 100 
1 2 2015-09-31 value  95 
2 3 2015-09-31 value  42 
3 1 2015-09-31 value2 200 
4 2 2015-09-31 value2  57 
5 3 2015-09-31 value2  27 
+1

+1 लेकिन विस्तार का एक छोटा सा आदर्श होगा। इसके अलावा पूंजी कॉलम नामों को शुरू कर सकती है क्योंकि मुझे इतने सारे मूल्यों के साथ भ्रमित हो गया है। – josh

7

तो यह एक तरीका है कि आपको थोड़ा क्लीनर मिल सकता है, इस तथ्य का उपयोग करके कि columns और Series नाम भी ले सकते हैं।

In [45]: df 
Out[45]: 
       value value2 
id date      
1 2015-09-31 100  200 
2 2015-09-31  95  57 
3 2015-09-31  42  27 

In [46]: df.columns.name = 'var_name' 

In [47]: s = df.stack() 

In [48]: s.name = 'value' 

In [49]: s.reset_index() 
Out[49]: 
    id  date var_name value 
0 1 2015-09-31 value 100 
1 1 2015-09-31 value2 200 
2 2 2015-09-31 value  95 
3 2 2015-09-31 value2  57 
4 3 2015-09-31 value  42 
5 3 2015-09-31 value2  27 
संबंधित मुद्दे