簡體   English   中英

有沒有更有效的方法可以在 Dataframe 的每一行上帶來特定值的 total.count() 值? (不合並,最好用lambda)

[英]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 倍以上。

解釋

  • 在您當前的解決方案中 df.groupby("Parent_contract")["Child_contract"].count().to_frame() 為每一行重新計算。
  • 預先計算和分配給 fr 避免了這種重復工作。

表現

測試代碼

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM