首页 > 解决方案 > 在 groupby 中的每个 id 的末尾添加缺少的行

问题描述

在此示例中,更准确地说,在响应列中,我有交通方式(公共汽车、汽车、地铁和步行)和目的地(工作、家庭和购物),目的地位于每个 ID 的末尾,但有些 ID 没有有目的地,我必须用未知值填充并增加num_resp列值(假设时间戳num_resp已排序)。

df = pd.DataFrame({'id': [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 5, 5], 
                   'response': ['car', 'walk', 'home', 'metro', 'walk', 'car', 'walk', 'metro', 'work', 'walk',
                                'bus', 'metro', 'walk', 'shopping'], 
                   'num_resp': [0, 1, 2, 0, 1, 0, 1, 2, 3, 0, 0, 1, 2, 3],
                   'timestamp': ['2018-02-15 07:35:00', '2018-02-15 08:30:00', '2018-02-15 09:00:00',
                                 '2018-02-15 07:00:30', '2018-02-15 07:30:00', '2018-02-15 07:00:00', 
                                 '2018-02-15 07:45:00', '2018-02-15 08:00:00', '2018-02-15 08:35:00',
                                 '2018-02-15 07:30:00', '2018-02-15 07:35:00', '2018-02-15 07:45:00',
                                 '2018-02-15 08:00:00', '2018-02-15 08:30:00']})

初始数据框:

在此处输入图像描述

我在找什么:

在此处输入图像描述

标签: pandaspandas-groupby

解决方案


尝试这个。

dest= ['work','home','shopping']
def func(x):
    if (~x['response'].tail(1).isin(dest).any()):
        last_row = x.iloc[-1]
        return x.append(last_row)
    return x
df_new= df.groupby('id').apply(func).reset_index(drop=True)
df_new.loc[df_new.duplicated(),'response']='unknown'
df_new['num_resp']=df_new.groupby('id').cumcount()
print(df_new)

或者

dest= ['work','home','shopping']
a = ~df.groupby('id')['response'].tail(1).isin(dest)
df_new=df.append(df.loc[a[a==True].index]).sort_values('id').reset_index(drop=True)
df_new.loc[df_new.duplicated(),'response']='unknown'
df_new['num_resp']=df_new.groupby('id').cumcount()
df_new

输出

id  response    num_resp    timestamp
0   1   car     0   2018-02-15 07:35:00
1   1   walk    1   2018-02-15 08:30:00
2   1   home    2   2018-02-15 09:00:00
3   2   metro   0   2018-02-15 07:00:30
4   2   walk    1   2018-02-15 07:30:00
5   2   unknown     2   2018-02-15 07:30:00
6   3   car     0   2018-02-15 07:00:00
7   3   walk    1   2018-02-15 07:45:00
8   3   metro   2   2018-02-15 08:00:00
9   3   work    3   2018-02-15 08:35:00
10  4   walk    0   2018-02-15 07:30:00
11  4   unknown     1   2018-02-15 07:30:00
12  5   bus     0   2018-02-15 07:35:00
13  5   metro   1   2018-02-15 07:45:00
14  5   walk    2   2018-02-15 08:00:00
15  5   shopping    3   2018-02-15 08:30:00

推荐阅读