2017-01-18 13 views
6

को 2 कॉलम के साथ एक साधारण पांडा डेटा फ्रेम के साथ प्रतिस्थापित करें। id और value जहां value है या तो 0 या 1 मैं चाहूँगा बेतरतीब ढंग से 0 के साथ सभी value==1 की 10% को बदलने के लिए।पांडा यादृच्छिक रूप से के प्रतिशत

मैं इस व्यवहार को पांडा के साथ कैसे प्राप्त कर सकता हूं?

उत्तर

8

pandas जवाब

  • उपयोग query केवल value == 1
  • उपयोग sample(frac=.1) साथ df फ़िल्टर किया पाने के लिए उन
  • का 10% लेने के लिए आवंटित करने के लिए परिणाम के सूचकांक का उपयोग शून्य

df.loc[ 
    df.query('value == 1').sample(frac=.1).index, 
    'value' 
] = 0 

विकल्प numpy जवाब

  • जहां df['value'] है 1
  • 10% शून्य और 90% लोगों
के यादृच्छिक सरणी आवंटित की बूलियन सरणी मिल
v = df.value.values == 1 
df.loc[v, 'value'] = np.random.choice((0, 1), v.sum(), p=(.1, .9)) 
+0

आप 'क्वेरी' फ़ंक्शन प्रायोजक बन रहे हैं :-) – Boud

+0

@ ध्वनि मैं एक विशेष सुविधा पर ध्यान केंद्रित करता हूं और इसके साथ कई प्रश्नों का उत्तर देता हूं। – piRSquared

2

आप शायद numpy.random.choice उपयोग कर सकते हैं:

>>> idx = df.index[df.value==1] 
>>> df.loc[np.random.choice(idx, size=idx.size/10, replace=False)].value = 0 
+0

ओपी केवल उन पंक्तियों को यादृच्छिक रूप से प्रतिस्थापित करना चाहता है जो '1' हैं, पूरे डीएफ – EdChum

+0

के यादृच्छिक नमूना नहीं, मुझे याद आया कि, जवाब बदलने जा रहा है –

2

यहाँ np.random.choice के साथ एक NumPy दृष्टिकोण है -

a = df.value.values # get a view into value col 
idx = np.flatnonzero(a) # get the nonzero indices 

# Finally select unique 10% from those indices and set 0s there 
a[np.random.choice(idx,size=int(0.1*len(idx)),replace=0)] = 0 

नमूना रन -

In [237]: df = pd.DataFrame(np.random.randint(0,2,(100,2)),columns=['id','value']) 

In [238]: (df.value==1).sum() # Original Count of 1s in df.value column 
Out[238]: 53 

In [239]: a = df.value.values 

In [240]: idx = np.flatnonzero(a) 

In [241]: a[np.random.choice(idx,size=int(0.1*len(idx)),replace=0)] = 0 

In [242]: (df.value==1).sum() # New count of 1s in df.value column 
Out[242]: 48 

वैकल्पिक रूप से, थोड़ा अधिक पांडा दृष्टिकोण -

idx = np.flatnonzero(df['value']) 
df.ix[np.random.choice(idx,size=int(0.1*len(idx)),replace=0),'value'] = 0 

रनटाइम परीक्षण

सभी दृष्टिकोण अब तक तैनात -

def f1(df): #@piRSquared's soln1 
    df.loc[df.query('value == 1').sample(frac=.1).index,'value'] = 0 

def f2(df): #@piRSquared's soln2 
    v = df.value.values == 1 
    df.loc[v, 'value'] = np.random.choice((0, 1), v.sum(), p=(.1, .9)) 

def f3(df): #@Roman Pekar's soln 
    idx = df.index[df.value==1] 
    df.loc[np.random.choice(idx, size=idx.size/10, replace=False)].value = 0 

def f4(df): #@Mine soln1 
    a = df.value.values 
    idx = np.flatnonzero(a) 
    a[np.random.choice(idx,size=int(0.1*len(idx)),replace=0)] = 0 

def f5(df): #@Mine soln2 
    idx = np.flatnonzero(df['value']) 
    df.ix[np.random.choice(idx,size=int(0.1*len(idx)),replace=0),'value'] = 0 

समय -

In [2]: # Setup inputs 
    ...: df = pd.DataFrame(np.random.randint(0,2,(10000,2)),columns=['id','value']) 
    ...: df1 = df.copy() 
    ...: df2 = df.copy() 
    ...: df3 = df.copy() 
    ...: df4 = df.copy() 
    ...: df5 = df.copy() 
    ...: 

In [3]: # Timings 
    ...: %timeit f1(df1) 
    ...: %timeit f2(df2) 
    ...: %timeit f3(df3) 
    ...: %timeit f4(df4) 
    ...: %timeit f5(df5) 
    ...: 
100 loops, best of 3: 3.96 ms per loop 
1000 loops, best of 3: 844 µs per loop 
1000 loops, best of 3: 1.62 ms per loop 
10000 loops, best of 3: 163 µs per loop 
1000 loops, best of 3: 663 µs per loop 
संबंधित मुद्दे