添加一个新的数据框列,该列对某些列中的值进行计数,该值小于时间之前的日期

时间:2019-12-02 15:23:11

标签: pandas dataframe group-by

编辑

我想添加一个称为prev_message_left的新列,该列计算为否。每个ID的messages_left个数小于给定时间之前的日期。基本上,我想有一列来说明在当前时间和日期之前,我们有多少次给客户打电话留言。这就是我的数据框的样子

date       ID   call_time   message_left  
20191101    1        8:00              0
20191102    2        9:00              1
20191030    1       16:00              1
20191103    2       10:30              1
20191105    2       14:00              0
20191030    1       15:30              0

我想添加一列称为prev_message_left_count

date       ID   call_time   message_left  prev_message_left_count
20191101    1        8:00              0                        1
20191102    2        9:00              1                        0
20191030    1       16:00              1                        0
20191103    2       10:30              1                        1
20191105    2       14:00              0                        2
20191030    1       15:30              0                        0

我的数据框有15列和9万行。
我在此数据框中还有其他各种列,并且有“ No Message Left”(无消息遗留),“ Responded”(已响应)之类的列,我将不得不为这些列计算称为“ Previous_no_message_left”和“ prev_responded”的其他列,类似于“ prev_message_left”

1 个答案:

答案 0 :(得分:1)

使用DataFrame.sort_values来按组正确的顺序获取累积和。您可以使用DataFrame.groupby创建组:

df['prev_message_left_count']= (df.sort_values(['date','call_time'])
                                  .groupby('ID')['message_left']
                                  .apply(lambda x: x.shift(fill_value=0)
                                                  .cumsum()) )

print(df)


       date  ID call_time  message_left  prev_message_left_count
0  20191101   1      8:00             0                        1
1  20191102   2      9:00             1                        0
2  20191030   1     16:00             1                        0
3  20191103   2     10:30             1                        1
4  20191105   2     14:00             0                        2
5  20191030   1     15:30             0                        0

有时GroupBy.apply速度很慢,因此建议使用

df['prev_message_left_count']=( df.sort_values(['date','call_time'])
                                  .groupby('ID')
                                  .shift(fill_value=0)
                                  .groupby(df['ID'])['message_left']
                                  .cumsum()