![](/img/trans.png)
[英]pandas how to get values from df2 for df1 while df1 and df2 have values overlapped on column(s)
[英]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 | 是 |
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)
最好的方法是什么? 我相信我有兩個可行的解決方案,它們非常慢。 我對這件事很陌生,所以我確信有更好的方法來處理它,有人能指出我正確的方向嗎?
這似乎有效,仍在驗證。
我可以用 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.