2014-05-03 11 views
15

मैं डेटा विश्लेषण के लिए वेस के पायथन के माध्यम से अपना रास्ता काम कर रहा हूं, और मैंने एक अजीब समस्या में भाग लिया है जिसे पुस्तक में संबोधित नहीं किया गया है।एक पांडस डेटाफ्रेम में स्पष्ट चर?

अपनी पुस्तक के पृष्ठ 199 के आधार पर नीचे दिए गए कोड में, मैं डेटाफ्रेम बना देता हूं और फिर pd.cut() का उपयोग cat_obj बनाने के लिए करता हूं। । आंतरिक रूप से यह एक स्तर को सरणी एक लेबलिंग के साथ अलग श्रेणी के नाम का संकेत होता है; पुस्तक के अनुसार, cat_obj

"एक विशेष स्पष्ट वस्तु आप इसे तार बिन नाम का संकेत है की एक सरणी की तरह व्यवहार कर सकते हैं लेबल गुणों में आयु डेटा "

बहुत बढ़िया! हालांकि, अगर मैं डेटाफ्रेम (df['cat'] कहा जाता है) का एक नया कॉलम बनाने के लिए सटीक उसी pd.cut() कोड (नीचे [5] कोड) का उपयोग करता हूं, तो उस कॉलम को विशेष वर्गीकृत चर के रूप में नहीं माना जाता है, लेकिन केवल नियमित पांडा श्रृंखला के रूप में।

फिर, मैं डेटाफ्रेम में एक कॉलम कैसे बना सकता हूं जिसे एक स्पष्ट चर के रूप में माना जाता है?

In [4]: 

import pandas as pd 

raw_data = {'name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'], 
     'score': [25, 94, 57, 62, 70, 25, 94, 57, 62, 70, 62, 70]} 
df = pd.DataFrame(raw_data, columns = ['name', 'score']) 

bins = [0, 25, 50, 75, 100] 
group_names = ['Low', 'Okay', 'Good', 'Great'] 

In [5]: 
cat_obj = pd.cut(df['score'], bins, labels=group_names) 
df['cat'] = pd.cut(df['score'], bins, labels=group_names) 
In [7]: 

type(cat_obj) 
Out[7]: 
pandas.core.categorical.Categorical 
In [8]: 

type(df['cat']) 
Out[8]: 
pandas.core.series.Series 
+2

एक DataFrame के सभी स्तंभों श्रृंखला होने जा रहे हैं, क्या व्यवहार आपको लगता है कि इस लक्ष्य को हासिल नहीं करता है के लिए देख रहे हैं? –

+1

डीएफ ['बिल्ली'] जैसी चीजें। स्तर काम नहीं करते हैं, लेकिन cat_obj.levels – Anton

+1

संभव डुप्लिकेट [स्ट्रिंग कॉलम से स्पष्ट के पांडा डेटाफ्रेम कॉलम कैसे उत्पन्न करें?] (Http://stackoverflow.com/questions/ 15356433/कैसे-से-जेनरेट-पांडा-डेटाफ्रेम-कॉलम-ऑफ-क्लासिकल-टू-स्ट्रिंग-कॉलम) –

उत्तर

0

अभी, आप एक सीरीज या DataFrame वस्तु में स्पष्ट डेटा हो सकता है, लेकिन इस कार्यक्षमता (सितंबर में होने वाले) Pandas 0.15 में लागू किया जाएगा।

1

यह setter- द्वारा इस तरह का व्यवहार की वजह से हो रहा हो सकता है:

नमूना गेटर और setter-

class a: 
    x = 1 
    @property 
    def p(self): 
     return int(self.x) 

    @p.setter 
    def p(self,v): 
     self.x = v 
t = 1.32 
a().p = 1.32 


print type(t) --> <type 'float'> 
print type(a().p) --> <type 'int'> 

अब df के लिए केवल Series data स्वीकार करता है और इसकी सेटर Series में Categorial data बदल देता है। df अगला पांडस रिलीज में categorial समर्थन देय है।

+1

यह अजीब व्यवहार, धन्यवाद बताता है। – rajat

0

http://pandas-docs.github.io/pandas-docs-travis/categorical.html से, पांडा 0.15 के बाद से

जब एक श्रृंखला का निर्माण निर्दिष्ट dtype = "श्रेणी":

In [1]: s = pd.Series(["a","b","c","a"], dtype="category") 

In [2]: s 
Out[2]: 
0 a 
1 b 
2 c 
3 a 
dtype: category 
Categories (3, object): [a, b, c] 

फिर आप एक मौजूदा श्रृंखला के लिए इस जोड़ सकते हैं।

या एक मौजूदा सीरीज या एक वर्ग dtype करने के लिए स्तंभ परिवर्तित:

In [3]: df = pd.DataFrame({"A":["a","b","c","a"]}) 

In [4]: df["B"] = df["A"].astype('category') 

In [5]: df 
Out[5]: 
    A B 
0 a a 
1 b b 
2 c c 
3 a a 
संबंधित मुद्दे