2013-10-09 7 views
8

मैं परिणाम के रूप में स्ट्रिंग युक्त तालिका के एक पिवट करने की कोशिश कर रहा हूं।पांडा - गैर-संख्यात्मक मानों के साथ pivot_table? (DataError: कुल संख्या के लिए कोई संख्यात्मक प्रकार)

import pandas as pd 

df1 = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': ["on","off","off","on","on","off","off","on"]}) 

df1.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

लेकिन मुझे मिलता है: DataError: No numeric types to aggregate

यह इरादा के रूप में जब मैं नंबरों के लिए परिणाम मूल्यों को बदल काम करता है:

df2 = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': [1,0,0,1,1,0,0,1]}) 

df2.pivot_table(values='result',rows='index',cols=['variable1','variable2','variable3']) 

और मैं मैं अपनी ज़रूरत की चीज़ों:

variable1 A    B  
variable2 a  b  a b 
variable3 x y x y x y 
index        
0   1 NaN NaN NaN NaN NaN 
1   NaN NaN 0 NaN NaN NaN 
2   NaN NaN NaN NaN 0 NaN 
3   NaN NaN NaN NaN NaN 1 
4   NaN 1 NaN NaN NaN NaN 
5   NaN NaN NaN NaN NaN 0 
6   NaN NaN NaN NaN 0 NaN 
7   NaN NaN NaN 1 NaN NaN 

मैं जानता हूँ कि मैं संख्यात्मक मानों के लिए तार के नक्शे और फिर रिवर्स कर सकते हैं ऑपरेशन, लेकिन शायद एक और सुरुचिपूर्ण समाधान है?

उत्तर

23

मेरी मूल जबाब पांडा 0.14.1 के आधार पर किया गया था, और तब से, बहुत सी बातें pivot_table समारोह में बदल (पंक्तियाँ -> सूचकांक, कॉलम -> कॉलम ...)

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

import pandas as pd 

df1 = pd.DataFrame({'index' : range(8), 
'variable1' : ["A","A","B","B","A","B","B","A"], 
'variable2' : ["a","b","a","b","a","b","a","b"], 
'variable3' : ["x","x","x","y","y","y","x","y"], 
'result': ["on","off","off","on","on","off","off","on"]}) 

# these are the columns to end up in the multi-index columns. 
unstack_cols = ['variable1', 'variable2', 'variable3'] 

पहले, सूचकांक का उपयोग कर डेटा पर एक सूचकांक सेट + वे कॉलम जिन्हें आप ढेर करना चाहते हैं, फिर स्तर तर्क का उपयोग करके अनस्टैक कॉल करें।

df1.set_index(['index'] + unstack_cols).unstack(level=unstack_cols) 

डेटाफ्रेम का परिणाम नीचे है।

enter image description here

+0

आखिरकार पंडों में पिवट() ​​परिवर्तनों को बदलने के लिए एक समाधान 0.17.1 – camdenl

+0

@RandallGoodwin, मुझे एहसास है कि यह प्रश्न दो साल का है, लेकिन मुझे त्रुटि मिल रही है "ValueError: फ़ंक्शन कम नहीं करता है "अपने लैम्ब्डा का उपयोग करके, अपने सिर के ऊपर से आपको पता चलेगा क्यों? – RustyShackleford

+1

एक और विचार: यदि आपके पास संभावित रूप से कई मान दिखाई देंगे, तो आप अपने 'aggfunc = lambda x: "" .join ([str) y में x के लिए बनाकर स्ट्रिंग को जोड़ सकते हैं]) – dllahr

2

मुझे लगता है कि सबसे अच्छा समझौता सही/गलत के साथ चालू/बंद करना है, जो पांडा को डेटा को बेहतर ढंग से समझने और एक बुद्धिमान, अपेक्षित तरीके से कार्य करने में सक्षम करेगा।

df2 = df1.replace({'on': True, 'off': False}) 

आपने अनिवार्य रूप से इसे अपने प्रश्न में स्वीकार कर लिया है। मेरा जवाब है, मुझे नहीं लगता कि एक बेहतर तरीका है, और आपको जो कुछ भी आता है उसके लिए आपको 'चालू'/'ऑफ' को प्रतिस्थापित करना चाहिए।

जैसा कि एंडी हेडन टिप्पणियों में बताते हैं, यदि आप 1/0 के साथ चालू/बंद करते हैं तो आपको बेहतर प्रदर्शन मिलेगा।

+1

+1, हालांकि के रूप में DataFrame वस्तु dtype बजाय नाव :) –

+0

मुझे लगता है कि कभी नहीं सोचा था है 1 और 0 का उपयोग करें ताकि बेहतर हो सकता है। अच्छी बात। –

+0

ठीक है, पर्याप्त स्पष्ट लगता है :) –

संबंधित मुद्दे