2015-01-17 15 views
9

के सबसेट के लिए शर्त के आधार पर मूल्यों को सेट करने का उचित तरीका मुझे यकीन नहीं है कि बिना किसी असाइनमेंट के यह कैसे किया जाए (जो शायद किसी भी तरह से काम नहीं करेगा क्योंकि मैं एक प्रतिलिपि स्थापित कर रहा हूं)।पांडा: मल्टीइंडेक्स डेटाफ्रेम

मैं एक मल्टीइंडेक्स पांडा डेटाफ्रेम का सबसेट नहीं लेना चाहता, शून्य से कम मानों के लिए परीक्षण करता हूं और उन्हें शून्य पर सेट करता हूं।

उदाहरण के लिए:

df = pd.DataFrame({('A','a'): [-1,-1,0,10,12], 
        ('A','b'): [0,1,2,3,-1], 
        ('B','a'): [-20,-10,0,10,20], 
        ('B','b'): [-200,-100,0,100,200]}) 

df[df['A']<0] = 0.0 

In [37]: 

df 

Out[37]: 
    A B 
    a b a b 
0 -1 0 -20 -200 
1 -1 1 -10 -100 
2 0 2 0 0 
3 10 3 10 100 
4 12 -1 20 200 

से पता चलता है कि यह कौन सा स्थिति के आधार पर स्थापित करने के लिए सक्षम नहीं था देता है। वैकल्पिक रूप से अगर मैं एक श्रृंखलित काम किया:

df.loc[:,'A'][df['A']<0] = 0.0 

यह वही परिणाम देता है (और प्रति चेतावनी के साथ की स्थापना)

मैं कर सकता है स्थिति के आधार पर प्रत्येक स्तंभ के माध्यम से लूप प्रथम स्तर से एक है कि है कि मैं हैं:

for one,two in df.columns.values: 
    if one == 'A': 
     df.loc[df[(one,two)]<0, (one,two)] = 0.0 

जो वांछित परिणाम देता है:

In [64]: 

df 

Out[64]: 
    A B 
    a b a b 
0 0 0 -20 -200 
1 0 1 -10 -100 
2 0 2 0 0 
3 10 3 10 100 
4 12 0 20 200 

लेकिन किसी भी तरह से मुझे लगता है कि कॉलम के माध्यम से लूपिंग करने से ऐसा करने का एक बेहतर तरीका है। पांडा में ऐसा करने का सबसे अच्छा तरीका क्या है?

उत्तर

9

यह एक आवेदन (और MultiIndex स्लाइसर का उपयोग कर के लिए मुख्य मंशा से एक) है यह देखने के डॉक्स here

In [20]: df = pd.DataFrame({('A','a'): [-1,-1,0,10,12], 
        ('A','b'): [0,1,2,3,-1], 
        ('B','a'): [-20,-10,0,10,20], 
        ('B','b'): [-200,-100,0,100,200]}) 

In [21]: df 
Out[21]: 
    A  B  
    a b a b 
0 -1 0 -20 -200 
1 -1 1 -10 -100 
2 0 2 0 0 
3 10 3 10 100 
4 12 -1 20 200 

In [22]: idx = pd.IndexSlice 

In [23]: mask = df.loc[:,idx['A',:]]<0 

In [24]: mask 
Out[24]: 
     A  
     a  b 
0 True False 
1 True False 
2 False False 
3 False False 
4 False True 

In [25]: df[mask] = 0 

In [26]: df 
Out[26]: 
    A  B  
    a b a b 
0 0 0 -20 -200 
1 0 1 -10 -100 
2 0 2 0 0 
3 10 3 10 100 
4 12 0 20 200 

आप स्तंभों सूचकांक के 1 स्तर के साथ काम कर रहे हैं के बाद से, निम्नलिखित रूप में काम करेंगे कुंआ। उपर्युक्त उदाहरण अधिक सामान्य है, कहें कि आप इसे 'ए' के ​​लिए करना चाहते हैं।

In [30]: df[df[['A']]<0] = 0 

In [31]: df 
Out[31]: 
    A  B  
    a b a b 
0 0 0 -20 -200 
1 0 1 -10 -100 
2 0 2 0 0 
3 10 3 10 100 
4 12 0 20 200 
+1

आह ठीक है धन्यवाद! मुखौटा बनाने के लिए स्लाइसर्स का उपयोग करना वास्तव में उपयोगी लगता है (इसे मेरे अधिक कोड में उपयोग करना पड़ सकता है)। दूसरा उदाहरण मेरी विशिष्ट समस्या को हल करता है। मुझे 'डीएफ ['ए']' और 'डीएफ [['ए']]' के बीच के अंतर के बारे में पता नहीं था – pbreach

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