pandas - 在 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']})
初始数据框:
我在找什么:
解决方案
尝试这个。
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