2013-10-08 8 views
37

सबसेटिंग मैं आर से पायथन तक संक्रमण कर रहा हूं। मैंने अभी पांडों का उपयोग शुरू किया।एक पाइथन डेटाफ्रेम

k1 <- subset(data, Product = p.id & Month < mn & Year == yr, select = c(Time, Product)) 

अब, मैं अजगर में इसी तरह के सामान करना चाहता हूँ: मैं एक आर कोड है कि अच्छी तरह से सबसेट है। यह वही है जो मुझे अब तक मिला है:

import pandas as pd 
data = pd.read_csv("../data/monthly_prod_sales.csv") 


#first, index the dataset by Product. And, get all that matches a given 'p.id' and time. 
data.set_index('Product') 
k = data.ix[[p.id, 'Time']] 

# then, index this subset with Time and do more subsetting.. 

मुझे यह महसूस करना शुरू हो रहा है कि मैं यह गलत तरीका कर रहा हूं। शायद, एक सुरुचिपूर्ण समाधान है। क्या कोई मदद कर सकता है? मुझे टाइमस्टैम्प से महीने और साल निकालने की ज़रूरत है और सबसेटिंग करें। शायद एक ऐसा लाइनर है जो यह सब पूरा करेगा:

k1 <- subset(data, Product = p.id & Time >= start_time & Time < end_time, select = c(Time, Product)) 

धन्यवाद।

उत्तर

66

मुझे लगता है कि Time और Product एक DataFrame में स्तंभ हैं मान लेंगे, dfDataFrame का एक उदाहरण है, और कहा कि अन्य चर अदिश मान हैं:

अभी के लिए, आप संदर्भ के लिए DataFrame उदाहरण होगा:

k1 = df.loc[(df.Product == p_id) & (df.Time >= start_time) & (df.Time < end_time), ['Time', 'Product']] 

कोष्ठकों & ऑपरेटर बनाम तुलना ऑपरेटरों की पूर्वता की वजह से आवश्यक भी है। & ऑपरेटर वास्तव में एक ओवरलोडेड बिटवाई ऑपरेटर है जिसमें अंकगणितीय ऑपरेटरों के समान प्राथमिकता है जो बदले में तुलना ऑपरेटरों की तुलना में अधिक प्राथमिकता है।

pandas 0.13 में एक नया प्रयोगात्मक DataFrame.query() विधि उपलब्ध होगा।

query() के साथ आप इस तरह यह करना चाहते हैं::

In [9]: df = DataFrame({'gender': np.random.choice(['m', 'f'], size=10), 'price': poisson(100, size=10)}) 

In [10]: df 
Out[10]: 
    gender price 
0  m  89 
1  f 123 
2  f 100 
3  m 104 
4  m  98 
5  m 103 
6  f 100 
7  f 109 
8  f  95 
9  m  87 

In [11]: df.query('gender == "m" and price < 100') 
Out[11]: 
    gender price 
0  m  89 
4  m  98 
9  m  87 

अंतिम क्वेरी आप कर रहे हैं कि:

df[['Time', 'Product']].query('Product == p_id and Month < mn and Year == yr') 

यहाँ एक सरल उदाहरण है यह सापेक्ष select तर्क सबसेट को अत्यंत समान है दिलचस्पी भी जंजीर तुलना का लाभ लेने में सक्षम होगी, जैसे:

k1 = df[['Time', 'Product']].query('Product == p_id and start_time <= Time < end_time') 
+0

धन्यवाद फिलिप। यह अच्छा काम करता है। यह वही है जो मैं खोज रहा था - एक सरल, त्वरित समाधान। बहुत धन्यवाद फिर से। ऐसे समाधान की तलाश करने वालों के लिए, मैंने जो समय इस्तेमाल किया वह इस तरह है: (data.ts> = '2012-10-01') और (data.ts <'2013-05-01')। – user1717931

+0

ज़रूर! मदद करने के लिए खुश। –

+0

@ फिलिप, मैंने अपनी शर्तों में ठोस मूल्यों के साथ iPython से आपके सुझाव की कोशिश की। उन्होंने ठीक काम किया। लेकिन, जब मैं इसे प्रोग्राम में एम्बेड करता हूं और पैरामीटर के साथ कॉल करता हूं, तो मुझे एक त्रुटि मिलती है - अंतिम पंक्तियां हैं: 'कोड' फ़ाइल "/usr/local/lib/python2.7/dist-packages/pandas/core/series .py ", लाइन 225, रैपर में यदि लेन (स्वयं)! = लेन (अन्य): टाइप त्रुटि: अनसुलझा ऑब्जेक्ट का len() – user1717931

14

बस किसी को अधिक अनुसंधान करने के लिए इसी तरह की एक समाधान की तलाश में के लिए:

df[(df.Product == p_id) & (df.Time> start_time) & (df.Time < end_time)][['Time','Product']] 

data.loc या query के लिए कोई ज़रूरत नहीं है, लेकिन मैं यह थोड़ा लंबा है लगता है।

5

मुझे पता चला है कि आप दिए गए कॉलम के लिए किसी भी उपसेट स्थिति का उपयोग [] में लपेटकर कर सकते हैं। उदाहरण के लिए, यदि आप स्तंभों [ 'उत्पाद', 'समय', 'वर्ष', 'रंग']

और मान लीजिए कि आप से पहले 2014 आप लिख सकते हैं बने उत्पादों शामिल करना चाहते हैं के साथ एक df, है

df[df['Year'] < 2014] 

सभी पंक्तियों को वापस करने के लिए जहां यह मामला है। आप विभिन्न स्थितियों को जोड़ सकते हैं।

df[df['Year'] < 2014][df['Color' == 'Red'] 

फिर ऊपर दिए गए अनुसार इच्छित कॉलम चुनें। उदाहरण के लिए, उपरोक्त डीएफ के लिए उत्पाद रंग और कुंजी,

df[df['Year'] < 2014][df['Color' == 'Red'][['Product','Color']] 
संबंधित मुद्दे