Python 根据条件从数据帧中删除行

Python 根据条件从数据帧中删除行,python,python-2.7,pandas,Python,Python 2.7,Pandas,考虑以下代码: 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[~ fram

考虑以下代码:

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) 在数据帧中循环以删除任何已在数据帧中具有
1RR
RR

2) 如果
RR
在开始时有
2或3
,那么如果
RR
在数据帧中有
1RR[1://code>,则删除

3) 如果
RR
1
启动,或是
NaN
启动,请勿触摸它

代码运行正常,但是这个
dataframe
将有多达100万个条目,我认为这个代码没有得到优化。因为我刚刚开始使用
pandas
,我的知识有限。
有没有任何方法可以不经过
迭代
就实现这一点。
熊猫
是否有任何内置的实用程序来实现这一点?

首先,保持所有字符串以
1
nan
开头:

keep = frame['RR'].str.startswith("1", na=True)
keep1 = keep[keep]  # will be used at the end
第二个,保留不在第一个数据帧中的以
2
3
开头的字符串
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))
第三个,在添加前导的
1
后保留不在
rr1
中的其他字符串:

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()]

你说的
1RR
是什么意思?@ian字符串
1
+
RR
就像我们这里的
asas
,还有
1asas
,这样
asas
就会被删除,我没有时间给出完整的答案,但这段代码可以为你指明正确的方向:
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 gr8!!!!thanx…将查找第一个条件…但这将返回整个新帧rt?我们可以有两种方法。。。你可以做的一个,或者我们可以使用另一个,我们可以
从现有框架中删除
行。这两个选项中哪一个比较好?我认为两者之间没有任何实际区别。