繁体   English   中英

为了加快代码速度,Python 3.8/Pandas Dataframe

[英]Looking to speed up code, Python 3.8/Pandas Dataframe

现有的 Dataframe 大约有 500,000 行,构建如图所示

TITLE_NO 物品种类 COMPONENT_NO COLLECTION_NAME DATE_ENTERED
162494 2 主录音 2003 年 5 月 15 日下午 3:50
162494 G 1 主录音 2003 年 5 月 15 日下午 3:41

任务 - 针对整个 dataframe 评估每个唯一的 title_no(可能出现在多行中)。 条件是 select dataframe 中包含每个唯一 title_no 的所有行,当所有包含该 title_no 的行的 ITEM_TYPE 为“G”时。 如果该 title_no 的返回值中的任何行具有“G”以外的值,则应忽略整个 title_no。 结果是一个新的 dataframe 包含找到的所有满足条件的行。

因此,包含的示例中,两行都不会出现在生成的 dataframe 中,但如果第一行的 item_type 更改为“G”,则这两行都会出现在生成的 dataframe 中。

这有效,但速度很慢


df=pd.read_csv(filelocation)
titles = df.TITLE_NO.unique()
records=[]
for x in titles:
    df_new = df[df['TITLE_NO'] == x]
    if len(df_new)==len(df_new[df_new['ITEM_TYPE']=='G']):
        for x in df_new.values.tolist():
            records.append(x)
xdf = pd.DataFrame(records, columns='TITLE_NO','ITEM_TYPE','COMPONENT_NO','COLLECTION_NAME','DATE_ENTERED'])

任何帮助,将不胜感激。

我认为 groupby 申请可以为您节省很多时间

def check_for_G(x):
    if len(x)==len(x[x['ITEM_TYPE']=='G']):
        return x.values.tolist()
    else:
        return None

records = df.groupby('TITLE NO').apply(check_for_G)

在运行下一行之前,您可能需要对records进行一些后期处理

xdf = pd.DataFrame(records, columns='TITLE_NO','ITEM_TYPE','COMPONENT_NO','COLLECTION_NAME','DATE_ENTERED'])

使用 boolean 索引尝试 groupby。 这将避免任何循环,包括与apply一起使用的循环

# groupby and get the unique values of item_type
g = df.groupby('TITLE_NO')['ITEM_TYPE'].unique()
# boolean indexing with isin where the unique values are only 'G'
new_df = df[df['TITLE_NO'].isin(g[g.eq(['G'])].index)]

暂无
暂无

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

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