簡體   English   中英

使用兩個 Pandas 數據幀:在 DF1 中創建一個列,該列是對 df2 中的值組合在條件下出現的次數的計數

[英]Using Two Pandas Dataframes: Create a column in DF1 that is a count of how many times a combination of values occurs in df2 with conditions

我有兩個數據框,df2 是 df1 的子集。 數據代表呼叫中心的電話。 df1 是時間范圍內的所有呼叫,df2 表示在被接聽之前放棄的呼叫。

我想在 df2 中創建多個新列,這些列是放棄后回叫的行中電話號碼的次數。

df1:

聯系人 ID ANI_DIALNUM 日期 時間 約會時間
1323 1231231234 2021 年 1 月 1 日 13:30 2021 年 1 月 1 日 13:30
1324 1231231235 2021 年 1 月 1 日 16:30 2021 年 1 月 1 日 16:30 ñ
1325 1231231234 2021 年 1 月 1 日 17:30 2021 年 1 月 1 日 13:30 ñ

df2:

聯系人 ID ANI_DIALNUM 日期 時間 約會時間
1323 1231231234 2021 年 1 月 1 日 13:30 2021 年 1 月 1 日 13:30
  • 新欄目 1:“PotentialSameDayCallBacks”
  • 新欄目 2:“NextDayCallBacks
  • 新列 3:“Next7DayCallBacks”

DF1 約為 750,000 行 DF2 約為 175,000 行

對於上面的小示例表,我期望 df2:

聯系人 ID ANI_DIALNUM 日期 時間 約會時間 潛在的SameDayCallBacks
1323 1231231234 2021 年 1 月 1 日 13:30 2021 年 1 月 1 日 13:30 1

我嘗試循環並使用 a.apply(lambda....) 但兩者都非常慢。

abandons['PotentialSameDayCallBacks'] = abandons.apply( lambda x: len(df[(df['Date'] == x['Date'])  & (df['ANI_DIALNUM'] == x['ANI_DIALNUM']) & (df['DateTime'] > x['DateTime'])]), axis=1 )
for index, row, in abandons.iterrows():
    abanCounts.append( df[(df['Date'] == row['Date']) & (df['ANI_DIALNUM'] == row['ANI_DIALNUM']) & (df['DateTime'] > row['DateTime'])]['contact_id'].count() )

abandons['PotentialSameDayCallBacks'] = abanCounts

我也嘗試過矢量化,但系列 / df 的長度不同,所以我一直在那里遇到障礙,我不知道如何解決。

def countPotentialCallBacks(ani,startDate,startTime):
    
    return df.loc[ (df['ANI_DIALNUM'] == ani) & (df['Date'] == startDate) & (df['DateTime'] > startTime) ]['contact_id'].count()

countPotentialCallBacks(abandons['ANI_DIALNUM'].values, abandons['Date'].values, abandons['DateTime'].values)

最好的方法是什么? 我相信我有兩個可行的解決方案,它們非常慢。 我對這件事很陌生,所以我確信有更好的方法來處理它,有人能指出我正確的方向嗎?

這似乎有效,仍在驗證。

  • 呼叫中心的巨大電話列表
  • 當呼叫放棄時,當天的交易量百分比是回調的結果(如果呼叫放棄,我們在同一天再次看到該 ani 的頻率)
  • 如果我們配備人員來防止 x 放棄,那么放棄引起的回調的真正影響是什么?
  • 同樣的問題,但看第二天和接下來的 7 天

我可以用 sql 相當快地做到這一點,並不斷說服自己不要這樣做,在 memory 中使用 sqlite。 試圖用這個來學習 Pandas。


df = df.assign( PotentialSameDayCallBacks = df.sort_values('DateTime').groupby(['ANI_DIALNUM','Date']).cumcount())

df = df[df.abandon == 'Y']

df = df.groupby(['ANI_DIALNUM','Date'])['PotentialSameDayCallBacks'].max().sort_values(ascending=False).to_frame()

noSameDayCallBacks = df[df['PotentialSameDayCallBacks'] == 0]['PotentialSameDayCallBacks'].count()
sameDayCallBacks = df[df['PotentialSameDayCallBacks'] > 0]['PotentialSameDayCallBacks'].count()

sameDayCallBacks / df4['PotentialSameDayCallBacks'].count()


暫無
暫無

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

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