2012-03-06 28 views
22

में सरल क्रॉस-टैबलेशन मैंने pandas पर ठोकर खाई और यह सरल गणनाओं के लिए आदर्श लग रहा है जो मैं करना चाहता हूं। मेरे पास एक एसएएस पृष्ठभूमि है और यह सोच रहा था कि यह proc freq को प्रतिस्थापित करेगा - ऐसा लगता है कि यह भविष्य में जो करना चाहता है उससे स्केल करेगा। हालांकि, मुझे लगता है कि मेरे सिर को एक साधारण कार्य के आसपास नहीं लग रहा है (मुझे यकीन नहीं है कि मुझे pivot/crosstab/indexing पर देखना है - चाहे मेरे पास Panel या DataFrames आदि हो ...)। किसी ने मुझे कैसे करना है पर कुछ संकेत दे सकता है निम्नलिखित:पांडा

मैं दो CSV फ़ाइलें (वर्ष 2010 के लिए एक, वर्ष 2011 के लिए एक - सरल लेनदेन डेटा) - राशि कॉलम श्रेणी और राशि

2010:

AB,100.00 
AB,200.00 
AC,150.00 
AD,500.00 

2011:

AB,500.00 
AC,250.00 
AX,900.00 

ये अलग DataFrame वस्तुओं में लोड कर रहे हैं।

2010::

AB,300.00,2 
AC,150.00,1 
AD,500.00,1 

2011:

AB,500.00,1 
AC,250.00,1 
AX,900.00,1 

मैं क्या करना चाहते हैं क्या वर्ग, श्रेणी का योग है, और श्रेणी की आवृत्ति, जैसे मिलता है

मैं काम नहीं कर सकता कि मुझे pivot/crosstab/groupby/an index आदि का उपयोग करना चाहिए ... मैं या तो योग या आवृत्ति प्राप्त कर सकता हूं - मुझे लगता है कि मैं दोनों को प्राप्त नहीं कर सकता ... यह थोड़ा और जटिल हो जाता है क्योंकि मैं इसे महीने के आधार पर एक महीने में करना चाहता हूं, लेकिन मुझे लगता है कि अगर कोई मुझे सही तकनीक/दिशा में इंगित करने के लिए बहुत दयालु होगा तो मैं वहां से जा सकूंगा।

+0

तो क्या आप कह रहे हैं कि प्रत्येक '.csv' फ़ाइल केवल एक पंक्ति है, और उसके बाद उस पंक्ति में पहला मान उस वर्ष के बाद होता है जब आप इसे ऊपर प्रस्तुत करते हैं? – benjaminmgross

+0

हाय फैक्टर 3, यही तरीका है कि एस/ओ ने इसे प्रारूपित करने का फैसला किया है (पहली बार मैंने इसका इस्तेमाल किया है, इसलिए भविष्य में इसके लिए देखना होगा) ... मुझे स्पष्टीकरण दें ... दो फाइलें हैं - 2010। सीएसवी और 2011.csv; इनमें 'एन' कई पंक्तियां होती हैं जिनमें से प्रत्येक में दो कॉलम होते हैं। मैं इस सवाल को सरल बनाने की कोशिश कर रहा था - लेकिन सहमत हूं कि स्वरूपण कुछ हद तक भ्रामक है कि मैंने इसे वापस पढ़ा है! –

+0

मैंने इस [** क्यू एंड ए **] (https://stackoverflow.com/q/47152691/2336654) में कई विस्तृत उदाहरण और वैकल्पिक दृष्टिकोण प्रदान किए हैं जो आप या अन्य उपयोगी हो सकते हैं। – piRSquared

उत्तर

12

मान लिया जाये कि आप एक फ़ाइल की सामग्री के साथ 2010.csv

category,value 
AB,100.00 
AB,200.00 
AC,150.00 
AD,500.00 

तो कहा जाता है, multiple aggregation functions following a groupby लागू करने की क्षमता का उपयोग कर, आप कह सकते हैं:

import pandas 
data_2010 = pandas.read_csv("/path/to/2010.csv") 
data_2010.groupby("category").agg([len, sum]) 

आप एक परिणाम है कि मिलना चाहिए दिखता है

  value  
      len sum 
category    
AB   2 300 
AC   1 150 
AD   1 500 

नोट करें कि वेस शायद बिंदु पर आ जाएंगे बाहर राशि को अनुकूलित किया गया है और आपको शायद np.sum का उपयोग करना चाहिए।

+0

वह धक्का है जो मुझे चाहिए - टीवाई। मैं pivot_table (data_2010, पंक्तियां = '???', aggfunc = {'???': '???'}) आदि के साथ सभी प्रकार की कोशिश कर रहा था ... मुझे लगा कि मैं समस्या को अधिक जटिल बना रहा था। एक बार फिर धन्यवाद। –

16

v0.21 जवाब

index पैरामीटर के साथ उपयोग pivot_table:

df.pivot_table(index='category', aggfunc=[len, sum]) 

      len sum 
     value value 
category    
AB   2 300 
AC   1 150 
AD   1 500 

<= v0.12

यह इस pivot_table रुचि रखने वालों के लिए उपयोग कर ऐसा करने के लिए संभव है:

In [8]: df 
Out[8]: 
    category value 
0  AB 100 
1  AB 200 
2  AC 150 
3  AD 500 

In [9]: df.pivot_table(rows='category', aggfunc=[len, np.sum]) 
Out[9]: 
      len sum 
      value value 
category    
AB   2 300 
AC   1 150 
AD   1 500 

नोट उस परिणाम के कॉलम पदानुक्रम इंडेक्स किए गए। यदि आप एक से अधिक डेटा कॉलम था, तो आप इस तरह एक परिणाम मिलेगा:

In [12]: df 
Out[12]: 
    category value value2 
0  AB 100  5 
1  AB 200  5 
2  AC 150  5 
3  AD 500  5 

In [13]: df.pivot_table(rows='category', aggfunc=[len, np.sum]) 
Out[13]: 
      len   sum   
      value value2 value value2 
category        
AB   2  2 300  10 
AC   1  1 150  5 
AD   1  1 500  5 

मुख्य कारण __builtin__.sum बनाम np.sum उपयोग करने के लिए है कि आप NA-हैंडलिंग बाद से मिलता है। शायद पाइथन अंतर्निहित को रोक सकता है, अब इसके बारे में एक नोट बना देगा।

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