2013-08-02 16 views
7

मैं कुछ रेखीय प्रतीपगमन विश्लेषण प्रदर्शन करने के लिए कोशिश कर रहा हूँ में सबसे लगातार डमी चर के सबसेट हो जाओ, मैं कुछ स्पष्ट सुविधाओं है कि मैं सुपर भयानक get_dummies का उपयोग कर चर डमी परिवर्तित किया है।पांडा

मुझे जिस मुद्दे का सामना करना पड़ता है, जब मैं श्रेणियों के सभी तत्व जोड़ता हूं तो डेटाफ्रेम बहुत बड़ा हो जाता है।

वहाँ एक रास्ता सिर्फ उन सभी की बजाय सबसे लगातार पदों की डमी चर बनाने का (get_dummies या एक अधिक विस्तृत विधि का उपयोग कर) है?

उत्तर

0

आप पहली बार value_counts इस्तेमाल कर सकते हैं जो सबसे लगातार कर रहे हैं देखने के लिए:

In [11]: s = pd.Series(list('aabccc')) 

In [12]: s 
Out[12]: 
0 a 
1 a 
2 b 
3 c 
4 c 
5 c 
dtype: object 

In [13]: s.value_counts() 
Out[13]: 
c 3 
a 2 
b 1 
dtype: int64 

मूल्यों जो कम से कम लगातार (सभी उदाहरण को छोड़कर पहले दो) कर रहे हैं:

In [14]: s.value_counts().index[2:] 
Out[14]: Index([u'b'], dtype=object) 

आप बस कर सकते हैं replace इन सभी घटनाओं NaN के साथ:

In [15]: s1 = s.replace(s.value_counts().index[2:], np.nan) 

In [16]: s1 
Out[16]: 
0  a 
1  a 
2 NaN 
3  c 
4  c 
5  c 
dtype: object 

और get_dummies प्रदर्शन (जो मुझे लगता है कि NaN उपेक्षा करना चाहिए, लेकिन वहाँ एक बग, इसलिए notnull हैक है):

In [16]: pd.get_dummies(s1[s1.notnull()]) 
Out[16]: 
    a c 
0 1 0 
1 1 0 
3 0 1 
4 0 1 
5 0 1 

यदि आप इन परिणामों को शामिल करने के आप एक अलग प्लेसहोल्डर इस्तेमाल कर सकते हैं (चाहता था जैसे '_')।

+0

ओह क्रिप्स ऐसा लगता है कि 'get_dummies' में एक बग है, यह NaN को अनदेखा नहीं कर रहा है बल्कि कुछ अजीब कर रहा है ... –

5

उपयोग value_counts() आवृत्ति गिनती करने के लिए, और उसके बाद होने वाली पंक्तियां आप रहने चाहते हैं के लिए एक मुखौटा बनाने के लिए:

import pandas as pd 
values = pd.Series(["a","b","a","b","c","d","e","a"]) 
counts = pd.value_counts(values) 
mask = values.isin(counts[counts > 1].index) 
print pd.get_dummies(values[mask]) 

उत्पादन:

a b 
0 1 0 
1 0 1 
2 1 0 
3 0 1 
7 1 0 

आप सभी डेटा चाहते हैं:

values[~mask] = "-" 
print pd.get_dummies(values) 

आउटपुट:

- a b 
0 0 1 0 
1 0 0 1 
2 0 1 0 
3 0 0 1 
4 1 0 0 
5 1 0 0 
6 1 0 0 
7 0 1 0 
0

मैं जवाब है कि @HYRY एक समारोह है कि एक पैरामीटर (सीमा) होगा कि लोकप्रिय मूल्यों और अलोकप्रिय लोगों ('दूसरों' कॉलम में संयुक्त) को अलग करने के लिए किया जा सकता लिखने के लिए दे दिया करते थे।

df = ['a', 'a', np.nan, np.nan, 'a', np.nan, 'a', 'b', 'b', 'b', 'b', 'b', 
      'c', 'c', 'd', 'e', 'g', 'g', 'g', 'g'] 

data = pd.Series(df, name='dums') 

उपयोग के उदाहरण::

In: dum_sign(data) 
Out: 
    dums_a dums_b dums_g dums_others 
0  1  0  0   0 
1  1  0  0   0 
2  0  0  0   1 
3  0  0  0   1 
4  1  0  0   0 
5  0  0  0   1 
6  1  0  0   0 
7  0  1  0   0 
8  0  1  0   0 
9  0  1  0   0 
10  0  1  0   0 
11  0  1  0   0 
12  0  0  0   1 
13  0  0  0   1 
14  0  0  0   1 
15  0  0  0   1 
16  0  0  1   0 
17  0  0  1   0 
18  0  0  1   0 
19  0  0  1   0 

In: dum_sign(data, threshold=0.2) 
Out: 
    dums_b dums_others 
0  0   1 
1  0   1 
2  0   1 
3  0   1 
4  0   1 
5  0   1 
6  0   1 
7  1   0 
8  1   0 
9  1   0 
10  1   0 
11  1   0 
12  0   1 
13  0   1 
14  0   1 
15  0   1 
16  0   1 
17  0   1 
18  0   1 
19  0   1 

In: dum_sign(data, threshold=0) 
Out: 
    dums_a dums_b dums_c dums_d dums_e dums_g dums_others 
0  1  0  0  0  0  0   0 
1  1  0  0  0  0  0   0 
2  0  0  0  0  0  0   1 
3  0  0  0  0  0  0   1 
4  1  0  0  0  0  0   0 
5  0  0  0  0  0  0   1 
6  1  0  0  0  0  0   0 
7  0  1  0  0  0  0   0 
8  0  1  0  0  0  0   0 
9  0  1  0  0  0  0   0 
10  0  1  0  0  0  0   0 
11  0  1  0  0  0  0   0 
12  0  0  1  0  0  0   0 
13  0  0  1  0  0  0   0 
14  0  0  0  1  0  0   0 
15  0  0  0  0  1  0   0 
16  0  0  0  0  0  1   0 
17  0  0  0  0  0  1   0 
18  0  0  0  0  0  1   0 
19  0  0  0  0  0  1   0 

कोई कैसे Nans को संभालने के लिए सुझाव

import pandas as pd 
import numpy as np 

# func that returns a dummified DataFrame of significant dummies in a given column 
def dum_sign(dummy_col, threshold=0.1): 

    # removes the bind 
    dummy_col = dummy_col.copy() 

    # what is the ratio of a dummy in whole column 
    count = pd.value_counts(dummy_col)/len(dummy_col) 

    # cond whether the ratios is higher than the threshold 
    mask = dummy_col.isin(count[count > threshold].index) 

    # replace the ones which ratio is lower than the threshold by a special name 
    dummy_col[~mask] = "others" 

    return pd.get_dummies(dummy_col, prefix=dummy_col.name) 
# 

के कुछ डेटा बनाएँ? मेरा मानना ​​है कि नैनों को 'दूसरों' के रूप में नहीं माना जाना चाहिए।

युपीडी: मैं स्तंभ है कि मैं dummify करना चाहता था में 183 विभिन्न तार के साथ एक बहुत बड़ी डाटासेट (5 मिल ओ बीएस) पर यह परीक्षण किया है। कार्यान्वयन मेरे लैपटॉप पर 10 सेकंड अधिकतम लेता है।