[英]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])
我不確定您希望最終結果的形式,下面的示例假設您希望它在新的數據框中。
我們可以采用多種方式,但是,我選擇在下面創建一個函數,並為了清晰起見分解每一步。
datetime
以進行比較 starting
和discussing
之間的天數
cid
並遍歷每個cid
cid
是否同時具有我們感興趣的分段
cid
分配0 discussing
和starting
之間的差異 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.