[英]Is there a more efficient way to bring total .count() values of specific value on each row in Dataframe? (without merge, with lambda preferably)
新來的,我的第一篇文章,請耐心等待:)。
我想在我的 df 中添加一個新列,其中包含每行("Parent_contract")
(重復編號) 下的合同編號["Child_contract"]
(是唯一編號) 的總數。
我下面的語句可以完成這項工作,但是在我當前的 df 上處理需要相當多的時間。
df["Total_count"] = df.apply(lambda x: df.groupby("Parent_contract")["Child_contract"].count().to_frame().loc[x["Parent_contract"]],axis=1)
非常感謝任何答復。 為了清楚起見,我想修改 df 而不是過濾它。
您可以通過更改為來加快您當前的解決方案:
fr = df.groupby("Parent_contract")["Child_contract"].count().to_frame()
df["Total_count"] = df.apply(lambda x: fr.loc[x["Parent_contract"]],axis=1)
這使速度提高了 3 倍以上。
解釋
表現
測試代碼
from random import randint
def generate_data(min_rows):
' Generate dataframe with parent and child columns '
parent_idx, child_idx = 1, 1
d = {'Parent_contract':[],
'Child_contract': []}
while len(d['Parent_contract']) < min_rows:
add = randint(1, 5)
for _ in range(add):
d['Parent_contract'].append(f"p{parent_idx}")
parent_idx += 1
for _ in range(add):
d['Child_contract'].append(f"c{child_idx}")
child_idx += 1
return pd.DataFrame(d)
def posted_method(df):
' Posted method '
df["Total_count"] = df.apply(lambda x: df.groupby("Parent_contract")["Child_contract"].count().to_frame().loc[x["Parent_contract"]],axis=1)
return df
def suggested_method(df):
' Suggested Method '
fr = df.groupby("Parent_contract")["Child_contract"].count().to_frame()
df["Total_count"] = df.apply(lambda x: fr.loc[x["Parent_contract"]],axis=1)
return df
計時(使用timeit)
nRows Posted Method Suggested Method Speed Up
10 18.1 ms 6.37 ms 2.8
1,000 2.05 s 289 ms 7.1
10,000 1 min 5 s 3.01 s 21.5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.