2016-10-14 167 views
2

考慮以下代碼:大熊貓根據病情刪除數據框中行

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 

我在這裏是做什麼的,

1)通過dataframes循環刪除其已經在數據幀

1RR任何 RR

2)如果RR在啓動時有2 or 3,則在數據幀中如果RR的值爲1RR[1:]則丟棄。

3)如果RR開頭1或是NaN請勿觸摸它。

該代碼工作正常,但這dataframe將有多達100萬條目,我不認爲這個代碼是最佳。因爲我剛剛開始與pandas我有限的知識。 有沒有什麼辦法可以做到這一點,沒有iterationpandas有什麼內置的工具可以做到這一點?

+0

你說的'1RR'是什麼意思? – IanS

+0

@IanS字符串'1' +'RR'就像我們在這裏'asas'和'1asas'那樣''asas'將會被丟棄 – vks

+0

我沒有時間給一個完全成熟的答案,但是這個代碼可以指向正確的方向:'series1 = frame.loc [frame ['RR']。str.startswith(「1」,na = False),'RR']; frame.loc [(frame ['RR']。str.startswith(「2」))| (frame ['RR']。str.startswith(「3」)),'RR']。str.slice(1).isin(series1.str.slice(1))'(處理您的第二個條件)。 – IanS

回答

1

首先,保留所有字符串開頭1nan

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

,保持琴絃與23不在第一數據幀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)) 

第三,k EEP其他字符串不在rr1加入後領先1

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

最後,把一切融合在一起:

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

我們可以有兩種方法......你可以使用另一種方法,或者我們可以使用另一種方法從現有框架中「拖放」行。這兩種方法中的哪一種會很好? – vks

+0

我不認爲兩者有任何實際區別。 – IanS