2012-08-03 34 views
7

मेरे पास चार कॉलम, A, B, C, D के साथ एक पांडस DataFrame है। यह पता चला है कि, कभी-कभी, B और C के मान 0 हो सकते हैं। इसलिए मैं निम्नलिखित प्राप्त करने के लिए चाहते हैं:पांडस डेटाफ्रेम लागू करें

B[i] = B[i] if B[i] else min(A[i], D[i]) 
C[i] = C[i] if C[i] else max(A[i], D[i]) 

जहाँ मैं i का इस्तेमाल किया है फ्रेम के सभी पंक्तियों पर एक रन से संकेत मिलता है।

df[df.B == 0] and df[df.C == 0] 

लेकिन मैं पता नहीं कितनी आसानी से ऊपर परिवर्तन प्रदर्शन करने के लिए है: पांडा के साथ यह पंक्तियाँ जो शून्य स्तंभ को खोजने के लिए आसान है। मैं विभिन्न अक्षम और सुरुचिपूर्ण तरीकों (for पूरे फ्रेम पर लूप) के बारे में सोच सकता हूं लेकिन कुछ भी आसान नहीं है।

उत्तर

8

बूलियन इंडेक्सिंग और लागू करने का एक संयोजन चाल कर सकता है। कॉलम सी के लिए शून्य तत्व को बदलने पर एक उदाहरण के नीचे

In [22]: df 
Out[22]: 
    A B C D 
0 8 3 5 8 
1 9 4 0 4 
2 5 4 3 8 
3 4 8 5 1 

In [23]: bi = df.C==0 

In [24]: df.ix[bi, 'C'] = df[bi][['A', 'D']].apply(max, axis=1) 

In [25]: df 
Out[25]: 
    A B C D 
0 8 3 5 8 
1 9 4 9 4 
2 5 4 3 8 
3 4 8 5 1 
+1

काफी साफ। हालांकि, मुझे लगता है कि आप 'लागू (...) 'के बजाय' .max (axis = 1)' से दूर हो सकते हैं। –

+0

'अधिकतम()' बिल्कुल भी ठीक है, मुझे लगता है कि मैंने प्रश्न पूछने के तरीके से 'लागू' की ओर पक्षपात प्राप्त किया है :-) –

2

डेटाफ्रेम के पंक्तियों के माध्यम से कुशलतापूर्वक पुनरावृत्ति के लिए 'iterrows' डेटाफ्रेम क्लास विधि आज़माएं। पांडा 0.8.1 मार्गदर्शिका के अध्याय 6.7.2 देखें।

from pandas import * 
import numpy as np 

df = DataFrame({'A' : [5,6,3], 'B' : [0,0,0], 'C':[0,0,0], 'D' : [3,4,5]}) 

for idx, row in df.iterrows(): 
    if row['B'] == 0: 
     row['B'] = min(row['A'], row['D']) 
    if row['C'] == 0: 
     row['C'] = min(row['A'], row['D']) 
संबंधित मुद्दे