2016-10-14 6 views
2

diesen Code vor:Pandas Löschen von Zeilen von Datenrahmen basierend auf Bedingung

from StringIO import StringIO 
import pandas as pd 

txt = """a, RR 
10, 1asas 
20, 1asasas 
30, 
40, asas 
50, ayty 
60, 2asas 
80, 3asas""" 
frame = pd.read_csv(StringIO(txt), skipinitialspace=True) 

print frame,"\n\n\n" 

l=[] 
for i,j in frame[~ frame['RR'].str.startswith("1", na=True)]['RR'].iteritems(): 
    if j.startswith(('2','3')): 
     if frame[frame['RR'].str.startswith("1", na=False)]['RR'].str.match("1"+j[1:], as_indexer = True).any(): 
      l.append(i) 
    else: 
     if frame[frame['RR'].str.startswith("1", na=False)]['RR'].str.match("1"+j, as_indexer = True).any(): 
      l.append(i) 
frame = frame.drop(frame.index[l]) 
print frame 

Was ich hier ist tue,

1) Schleife durch Datenrahmen jeden RR fallen zu lassen, die bereits 1RR in Datenrahmen hat

2) Wenn RR am Anfang 2 or 3 hat, dann fallen, wenn das RR1RR[1:] im Dataframe hat.

3) Wenn RR startswith 1 oder NaN ist, berühren Sie es nicht.

Der Code funktioniert gut, aber dieser dataframe wird bis zu 1 Million Einträge haben und ich glaube nicht, dass dieser Code optimiert ist.Wenn ich gerade mit pandas gestartet habe, habe ich begrenzte Kenntnisse. Gibt es eine Möglichkeit, dies ohne iteration zu erreichen. Hat pandas ein eingebautes Dienstprogramm, um dies zu tun?

+0

Was meinst du mit '1RR'? – IanS

+0

@IanS die string '1' +' RR' wie wir hier haben 'asas' und auch' 1asas' so dass 'asas' fallen gelassen werden – vks

+0

Ich habe keine Zeit für eine vollwertige Antwort, aber dieser Code könnte weisen Sie in die richtige Richtung: 'series1 = frame.loc [frame ['RR']. str.startswith (" 1 ", na = Falsch), 'RR']; frame.loc [(Rahmen ['RR']. str.startswith ("2")) | (frame ['RR']. str.startswith ("3")), 'RR']. str.slice (1) .isin (series1.str.slice (1)) '(behandelt Ihre zweite Bedingung). – IanS

Antwort

1

Erste, halten alle Strings mit 1 oder nan Start:

keep = frame['RR'].str.startswith("1", na=True) 
keep1 = keep[keep] # will be used at the end 

Zweite, halten Saiten mit 2 oder 3 beginnen, die nicht in der ersten Datenrahmen sind rr1:

rr1 = frame.loc[frame['RR'].str.startswith("1", na=False), 'RR'] 
keep2 = ~frame.loc[ 
      (frame['RR'].str.startswith("2")) | (frame['RR'].str.startswith("3")), 'RR' 
     ].str.slice(1).isin(rr1.str.slice(1)) 

Dritte, k EEP andere Zeichenfolgen, die nicht in rr1 sind ein führender 1 nach Zugabe:

import numpy as np 
keep3 = ~("1" + frame.loc[ 
      ~frame['RR'].str.slice(0,1).isin([np.nan, "1", "2", "3"]), 'RR' 
     ]).isin(rr1) 

Schließlich, legte alles zusammen:

frame[pd.concat([keep1, keep2, keep3]).sort_index()] 
+0

Wir können zwei Ansätze haben ... den einen, den Sie tun, oder wir können den anderen verwenden, wo wir Reihen aus dem bestehenden Rahmen "fallen lassen" können. Welche der 2 wäre hier gut? – vks

+0

Ich glaube nicht, dass es einen praktischen Unterschied zwischen den beiden gibt. – IanS

Verwandte Themen