簡體   English   中英

如何計算這個df Python Pandas階段之間的天數?

[英]How to calculate the number of days between stages in this df Python Pandas?

df = pd.DataFrame({'Campaign ID':[48464,48464,48464,48464,26380,26380,22676,39529,39529,46029,46029,46029,17030,46724,46724,39379,39379,39379],
'Campaign stage':["Lost","Developing","Discussing","Starting","Discussing", "Starting","Developing",    "Discussing","Starting","Developing",   "Discussing","Starting","Developing",   "Developing","Discussing","Lost",   "Developing","Discussing"],
'Stage Number':[-1, 3,  2,  1,  2,  1,  3,  2,  1,  3,  2,  1,  3,  3,  2,  -1, 3,  2],
'Campaign Date':["2/8/2019","1/9/2019","1/3/2019","3/3/2018","2/14/2019","12/5/2018","7/25/2018","6/8/2018","3/4/2018","12/8/2018","9/9/2018","5/31/2018","6/7/2018","3/27/2018","1/6/2018","2/15/2019","12/15/2018","9/4/2018"]})

pvt = pd.pivot_table(df,values=['Campaign stage'],index=['Campaign ID','Campaign stage','Stage Number','Campaign Date'],aggfunc='count')
pvt.sort_values(['Campaign ID','Campaign Date'],ascending=[True,False])

大家好,我有上面的數據框,我想計算每個廣告系列的廣告系列“開始”和“討論”之間的天數,然后計算平均值。

由於數據質量,活動階段不一致。 因此,對於廣告系列沒有“開始”和“討論”兩個階段,我想設置為0。

我創建了數據的數據透視表視圖,並按降序對廣告系列日期進行了排序......但我不知道下一步該怎么做。

先謝謝您的幫助。

這是我的建議,從你的df開始:

df['Campaign Date'] = pd.to_datetime(df['Campaign Date'])
df = df[df['Campaign stage'].isin(['Starting', 'Discussing'])]

pvt = pd.pivot_table(df,values=['Campaign stage'],index=['Campaign ID','Campaign stage','Stage Number','Campaign Date'],aggfunc='count')
pvt = pvt.sort_values(['Campaign ID','Campaign Date'],ascending=True).reset_index(level=3)

pvt.groupby(level=0).diff().sum(level=0)

輸出將是:

Campaign ID - Campaign Date
26380   71 days
39379   0 days
39529   96 days
46029   101 days
46724   0 days
48464   306 days

如果您要尋找的是總平均值:

pvt.groupby(level=0).diff().sum(level=0).mean()

這是:

95 days 16:00:00
df['Campaign Date'] =  pd.to_datetime(df['Campaign Date'],format='%m/%d/%Y')
compare= {}
for ids,gp in df.groupby('Campaign ID'):
    try:
        compare[ids]= gp.loc[gp['Campaign stage']=='Discussing']['Campaign Date'].iloc[0] - gp.loc[gp['Campaign stage']=='Starting']['Campaign Date'].iloc[0]
    except:
        compare[ids] =0

df['new_col'] = df['Campaign ID'].apply(lambda x:compare[x])

我不確定您希望最終結果的形式,下面的示例假設您希望它在新的數據框中。

我們可以采用多種方式,但是,我選擇在下面創建一個函數,並為了清晰起見分解每一步。

  • 第1步:將日期數據類型更新為datetime以進行比較
  • 第2步:調用函數步驟2.1:定義空列表以存儲我們的cids值和startingdiscussing之間的天數
    • 步驟2.2:獲取所有唯一的cid並遍歷每個cid
    • 步驟2.3:檢查cid是否同時具有我們感興趣的分段
      • 步驟2.3.1:如果沒有為此cid分配0
      • 步驟2.3.2:否則計算discussingstarting之間的差異
    • 步驟2.4:創建我們的新數據幀並返回它
    • 步驟2.5:使用df.loc創建並計算我們的平均日指數

# First we need to modify your data type to compare the dates
df['Campaign Date'] = pd.to_datetime(df['Campaign Date'])

df_days = getDays(df)

# We create a new index called 'Average' that will assign values to the days column
df_days.loc['Average','days'] = df_days.days.mean()

def getDays(df):
    days = list()
    cids = list()

    for cid in df['Campaign ID'].unique():
        stages = df[(df['Campaign ID'] == cid) & 
                    (df['Campaign stage'].str.lower().isin(['discussing', 'starting']))]['Campaign stage'].unique()

        if len(stages) < 2:
            d = 0
            c = cid

            days.append(d)
            cids.append(c)

        else:
            starting = df[(df['Campaign ID'] == cid) & (df['Campaign stage'].str.lower() == 'starting')]['Campaign Date'].dt.date.values
            discussing = df[(df['Campaign ID'] == cid) & (df['Campaign stage'].str.lower() == 'discussing')]['Campaign Date'].dt.date.values

            d = (discussing - starting)[0].days

            c = cid

            days.append(d)
            cids.append(c)


    dff = pd.DataFrame({
        'cids': cids,
        'days': days
    })          

    return dff

退房

        cids    days
0       48464.0 306.00
1       26380.0 71.00
2       22676.0 0.00
3       39529.0 96.00
4       46029.0 101.00
5       17030.0 0.00
6       46724.0 0.00
7       39379.0 0.00
Average NaN   71.75

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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