gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 05:21:53 25 4
gpt4 key购买 nike

考虑这段代码:

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,那么如果 RR1RR[1:]< 则丢弃 在数据框中。

3) 如果 RR1 开头或者是 NaN 不要碰它。

代码运行良好,但此 dataframe 将有多达 100 万个条目,我不认为此代码经过优化。因为我刚开始使用 pandas,所以我限制了知识。有什么方法可以在不迭代的情况下实现这一目标。pandas 是否有任何内置实用程序来执行此操作?

最佳答案

首先,保留所有以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))

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

关于python - Pandas 根据条件从数据框中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40039531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com