2017-02-20 10 views
6

पहले मामले में, मैं pandas.cut() का उपयोग करने के लिए pandas.cut() का उपयोग करने के लिए एक बहुत ही सरल DataFrame का उपयोग करने के लिए एक कॉलम में अद्वितीय मानों की संख्या को गिनने के लिए उपयोग करता हूं। कोड चलाता है के रूप में उम्मीद:pandas.cut() दो समान मामलों में अद्वितीय गणना में अलग-अलग व्यवहार क्यों करता है?

enter image description here

हालांकि, निम्नलिखित कोड में, pandas.cut() मायने रखता है गलत अनन्य मान की संख्या। मुझे उम्मीद है कि पहले बिन (1462320000, 1462406400] के पास 5 अद्वितीय मूल्य होंगे, और अंतिम बिन (1462752000, 1462838400] सहित अन्य डिब्बे 0 अद्वितीय मान होंगे।

इसके परिणामस्वरूप, परिणामस्वरूप दिखाया गया है, कोड 5 लौटाता है पिछले बिन (1462752000, 1462838400] में अद्वितीय मानों, जबकि 2 पर प्रकाश डाला क्योंकि वे सीमा से बाहर हैं मान नहीं गिना जाना चाहिए।

enter image description here

तो किसी को समझा सकता है क्यों pandas.cut() बहुत अलग बर्ताव करता है इन 2 मामलों में? और भी, मैं वास्तव में आभारी होंगे अगर आप मुझे यह भी बता सकते हैं कि मैं किसी कॉलम में किसी अन्य कॉलम के मूल्य के भीतर एक कॉलम में अद्वितीय मानों की संख्या को सही ढंग से गिनने के लिए कोड को कैसे सही कर सकता हूं।


additionnal जानकारी: (कृपया आयात pandas और numpy कोड को चलाने के लिए, मेरे पांडा संस्करण 0.19.2 है, और मैं अजगर 2.7 का उपयोग कर रहा)

अपने तैयार संदर्भ के लिए, मैं इसके द्वारा पोस्ट मेरी DataFrame और कोड तुम मेरे कोड पुन: पेश करने के लिए:

केस 1:

df = pd.DataFrame({'No': [1,1.5,2,1,3,5,10], 'useragent': ['a', 'c', 'b', 'c', 'b','a','z']}) 
print type(df) 
print df 
df.groupby(pd.cut(df['No'], bins=np.arange(0,4,1))).useragent.nunique() 

केस 2:

print type(df) 
print len(df) 
print df.time.nunique() 
print df.hash.nunique() 
print df[['time','hash']] 
df.groupby(pd.cut(df['time'], bins =np.arange(1462320000,1462924800,86400))).hash.nunique() 

केस 2 की डेटा:

time  hash 
1462328401 qo 
1462328401 qQ 
1462838401 q1 
1462328401 q1 
1462328401 qU 
1462328401 qU 
1462328401 qU 
1462328401 qU 
1462328401 qX 
1462838401 qX 

उत्तर

2

यह एक bug हो रहा है।

एक सरल उदाहरण पर:

In [50]: df=pd.DataFrame({'atime': [28]*8+[38]*2, 'hash':randint(0,3,10)} 
).sort_values('hash') 
Out[50]: 
     atime hash 
1  28  0 
3  28  0 
4  28  0 
5  28  0 
8  38  0 
2  28  1 
6  28  1 
0  28  2 
7  28  2 
9  38  2 

In [50bis;)]: df.groupby(pd.cut(df.atime,bins=arange(27,40,2))).hash.unique() 
Out[50bis]: 
atime 
(27, 29]     [0, 1, 2] # ok 
(29, 31]       [] 
(31, 33]       [] 
(33, 35]       [] 
(35, 37]       [] 
(37, 39]      [0, 2] 
Name: hash, dtype: object 

In [51]: df.groupby(pd.cut(df.atime,bins=arange(27,40,2))).hash.nunique() 
Out[51]: 
atime 
(27, 29] 2 # bug 
(29, 31] 0 
(31, 33] 0 
(33, 35] 0 
(35, 37] 0 
(37, 39] 2 
Name: hash, dtype: int64 

यहाँ एक कुशल वैकल्पिक हल हो सकता है, किसी सूची में कटौती परिणाम परिवर्तित करने लगता है:

एक आकर्षण की तरह
In [52]: df.groupby(pd.cut(df.atime,bins=arange(27,40,2)).tolist() 
).hash.nunique() 
Out[52]: 
atime 
(27, 29] 3 
(37, 39] 2 
Name: hash, dtype: int64 
+0

काम करता है। टॉलिस्ट के साथ मोड़ के लिए धन्यवाद() – weefwefwqg3

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