考慮以下代碼:大熊貓根據病情刪除數據框中行
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
我有限的知識。 有沒有什麼辦法可以做到這一點,沒有iteration
。pandas
有什麼內置的工具可以做到這一點?
你說的'1RR'是什麼意思? – IanS
@IanS字符串'1' +'RR'就像我們在這裏'asas'和'1asas'那樣''asas'將會被丟棄 – vks
我沒有時間給一個完全成熟的答案,但是這個代碼可以指向正確的方向:'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