2015-12-30 2 views
5

पर पांडा get_dummies से खुला सीमा संकेतक एक अंकीय उम्र पांडा स्तंभ, के रूप में वृद्ध qcut साथ discretize से, हम qcut सीमा से खुला सीमा बनाने ([यू '[5, 30]', यू '(30, 70]'], dtype = 'वस्तु') हम bopens बनाने:बनाएं discretized संख्यात्मक

>>> bopens = get_open_bounds(df) 
>>> bopens 
# ['(-inf, 5]', '(-inf, 30]', '(-inf, 70]', '(5, +inf)', '(30, +inf)', '(70, +inf)'] 

फिर हम डमी में स्पष्ट चर परिवर्तित/सूचक get_dummies साथ चर:

df = pd.get_dummies(df) 
print df 
# age ageD_[5, 30] ageD_(30, 70] 
# 0 5    1    0 
# 1 23    1    0 
# 2 43    0    1 
# 3 70    0    1 
# 4 30    1    0 

मैं खुले सीमा स्तंभों के साथ डेटा फ्रेम को बेहतर बनाने के लिए चाहते हैं, df.shape काफी बड़ा, ~ (10E6, 32) हो जाएगा। प्रत्येक पंक्ति 6 ​​बोपेन कोल्स बनाने के लिए सबसे अच्छा तरीका क्या है?

>>> df 
    age age_[5, 30] age_(30, 70] (-inf, 5] (-inf, 30] (-inf, 70] (5, +inf) (30, +inf) (70, +inf) 
0 5   1    0   1   1   1   0   0   0 
1 23   1    0   0   1   1   1   0   0 
2 43   0    1   0   0   1   1   1   0 
3 70   0    1   0   0   1   1   1   0 
4 30   1    0   0   1   1   1   0   0 

पुनश्च::

लक्ष्य df की तरह इस एक दिखेगा

def get_open_bounds(df): 
    bounds = [(int(x[1:]), int(y[:-1])) for x, y in 
      [c.split(', ') for c in df.ageD.cat.categories]] 
    bounds = list(chain(*bounds)) 
    bounds 
    # [5, 30, 30, 70] 

    # to get uniques, keeping the order 
    bounds = [b for idx, b in enumerate(bounds) if b not in bounds[:idx]] 

    # make the open bounds 
    bopens = ["(-inf, {}]".format(b) for b in bounds] + \ 
      ["({}, +inf)".format(b) for b in bounds] 
    return bopens 

उत्तर

2

IIUC, आप प्रसारण का एक सा के साथ ऐसा कर सकते हैं: get_open_bounds bopens बनाने के लिए इस्तेमाल:

df['ageD'], bins = pd.qcut(df.iloc[:, 0], 2, retbins=True) 
left = (df["age"].values <= bins[:,None]).T.astype(int) 
dl = pd.DataFrame(left, columns=["(-inf, {}]".format(b) for b in bins]) 
dr = pd.DataFrame(1-left, columns=["({}, +inf)".format(b) for b in bins]) 
dout = pd.concat([pd.get_dummies(df), dl, dr], axis=1) 

मुझे

देता है
>>> dout 
    age ageD_[5, 30] ageD_(30, 70] (-inf, 5] (-inf, 30] (-inf, 70] (5, +inf) (30, +inf) (70, +inf) 
0 5    1    0   1   1   1   0   0   0 
1 23    1    0   0   1   1   1   0   0 
2 43    0    1   0   0   1   1   1   0 
3 70    0    1   0   0   1   1   1   0 
4 30    1    0   0   1   1   1   0   0 

नोट # 1: retbins = True जोड़कर मैं डिब्बे खुद को मिलता है और कुछ अजीब स्ट्रिंग पार्स बच सकते हैं।

नोट # 2: एक अंतर्निहित "दाएं = 1 - बाएं" करके, मुझे लगता है कि कोई उम्र NaN नहीं है और इसलिए = = या < में से एक सत्य होना चाहिए; यदि यह निश्चित नहीं है, तो आप right = (df["age"].values > bins[:,None].T.astype(int) इसके बजाय कर सकते हैं।)

नोट # 3: वास्तव में मुझे फ्रेम कन्स्ट्रक्टर df.index भी पास करना चाहिए - जबकि आपके उदाहरण में कैननिकल इंडेक्स था, जो आपके लिए सच नहीं हो सकता है वास्तविक डेटा

+0

फ्रेम कन्स्ट्रक्टर को df.index पास करने का क्या मतलब है? – user3313834

+0

@ user3313834: डेटाफ्रेम कई डेटा लेता है, जिसमें 'डेटा' (यह क्या भरा जा रहा है),' कॉलम '(कॉलम के नाम) और' अनुक्रमणिका 'सहित कई तर्क लेते हैं। मैंने 'इंडेक्स' पास नहीं किया है, इसलिए 'dl' और' dr' सूचकांक 0,1,2,3 प्राप्त करें .. यदि आपके 'डीएफ' के पास 0,1,2,3 .. आदि नहीं है, तो concatenation अप्रत्याशित परिणाम देगा क्योंकि सूचकांक मेल नहीं खाते। – DSM

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