繁体   English   中英

Pandas 根据条件从数据框中删除行

[英]Pandas Delete rows from dataframe based on condition

考虑这个代码:

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 or 3 ,那么如果该RR在数据帧中有1RR[1:] ,则丢弃。

3)如果RR 1或者是NaN不要碰它。

该代码工作正常,但这个dataframe将有高达百万条目,我不认为这个代码是optimsed.As我刚开始与pandas ,我有知识有限。 有没有什么方法可以在没有iteration情况下实现这一点。 pandas是否有任何内置的实用程序来做到这一点?

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

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

其次,让不在第一个数据帧rr1中的字符串以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))

第三,在添加前导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()]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM