2015-10-11 7 views
6

की n लगातार उदाहरणों के आधार DF मैं एक dataframe काट करने के लिए पंक्तियों को वापस चाहते हैं जहां तत्व एक्स = 0 प्रकट होता है लगातार कम से कमn = 3 बार, और फिर पहली छोड़ने मैं = प्रत्येक मिनी अनुक्रम में 2 उदाहरणटुकड़ा पांडा तत्व

क्या पांडा में प्राप्त करने का एक प्रभावी तरीका है, और यदि नहीं, तो numpy या scipy का उपयोग कर?

import pandas as pd 
import numpy as np 

उदाहरण 1

df=pd.DataFrame({'A':[0,1,0,0,1,1,0,0,0,0,1,1,0,0,0,1,1],'B':np.random.randn(17)}) 

    A   B 
0 0 0.748958 
1 1 0.254730 
2 0 0.629609 
3 0 0.272738 
4 1 -1.885906 
5 1 1.206371 
6 0 -0.332471 
7 0 0.217553 
8 0 0.768986 
9 0 -1.607236 
10 1 1.613650 
11 1 -1.096892 
12 0 -0.435762 
13 0 0.131284 
14 0 -0.177188 
15 1 1.393890 
16 1 0.174803 

वांछित उत्पादन:

A   B 
8 0 0.768986 
9 0 -1.607236 
14 0 -0.177188 

उदाहरण 2

x = 0 (ब्याज के तत्व)

,210

एन = 5 (अनुक्रम का न्यूनतम लंबाई)

मैं = 2 (प्रत्येक अनुक्रम में ड्रॉप पहले दो)

df2=pd.DataFrame({'A':[0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,0],'B':np.random.randn(20)}) 

    A   B 
0 0 0.703803 
1 0 -0.144088 
2 0 0.635577 
3 0 -0.834611 
4 0 1.472271 
5 0 -0.554860 
6 0 -0.167016 
7 1 0.578847 
8 1 -1.873663 
9 0 0.197062 
10 0 1.458845 
11 0 -1.921660 
12 0 -1.301481 
13 0 0.240197 
14 0 -1.425058 
15 1 -2.801151 
16 0 0.766757 
17 0 1.249806 
18 0 0.595366 
19 0 -1.447632 

वांछित उत्पादन:

A   B 
2 0 0.635577 
3 0 -0.834611 
4 0 1.472271 
5 0 -0.554860 
6 0 -0.167016 
11 0 -1.921660 
12 0 -1.301481 
13 0 0.240197 
14 0 -1.425058 

उत्तर

2

यहाँ कुछ NumPy का उपयोग कर एक दृष्टिकोण है जोड़तोड़ -

def slice_consc(df,n): 

    Acol = np.array(df['A']) 
    Acol_ext = np.concatenate(([0],(Acol==0)+0,[0])) 

    starts = np.where(np.diff(Acol_ext)==1)[0] 
    stops = np.where(np.diff(Acol_ext)==-1)[0] 

    id = np.zeros(Acol.size+2,dtype=int) 

    valid_mask = stops - starts >= n 
    id[stops[valid_mask]] = -1 
    id[starts[valid_mask]+2] = 1 

    return df[(id.cumsum()==1)[:-2]] 

नमूना रन -

प्रकरण # 1:

>>> df 
    A   B 
0 0 0.977325 
1 1 -0.408457 
2 0 -0.377973 
3 0 0.567537 
4 1 -0.222019 
5 1 -1.167422 
6 0 -0.142546 
7 0 0.675458 
8 0 -0.184456 
9 0 -0.826050 
10 1 -0.772413 
11 1 -1.556440 
12 0 -0.687249 
13 0 -0.481676 
14 0 0.420400 
15 1 0.031999 
16 1 -1.092540 
>>> slice_consc(df,3) 
    A   B 
8 0 -0.184456 
9 0 -0.826050 
14 0 0.420400 

प्रकरण # 2:

>>> df2 
    A   B 
0 0 0.757102 
1 0 2.114935 
2 0 -0.352309 
3 0 -0.214931 
4 0 -1.626064 
5 0 -0.989776 
6 0 0.639635 
7 1 0.049358 
8 1 -2.600326 
9 0 0.057792 
10 0 1.263418 
11 0 0.618495 
12 0 -1.637054 
13 0 1.220862 
14 0 1.245484 
15 1 1.388218 
16 0 -0.499900 
17 0 0.761310 
18 0 -1.308176 
19 0 -2.005983 
>>> slice_consc(df2,5) 
    A   B 
2 0 -0.352309 
3 0 -0.214931 
4 0 -1.626064 
5 0 -0.989776 
6 0 0.639635 
11 0 0.618495 
12 0 -1.637054 
13 0 1.220862 
14 0 1.245484 
+0

आप समझा सकते हैं कि वह क्या करता? – hellpanderrr

+0

@hellpanderrr उस पर संक्षिप्त स्पष्टीकरण जोड़ा गया, इसे जांचें! – Divakar

+0

@ दिवाकर धन्यवाद, क्या आप स्पष्ट कर सकते हैं क्यों संरचना = np.ones ((n,)) संरचना = np.ones (n) के बजाय? – themachinist

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