[英]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.