一种优雅的方法,可以根据数据中的组使用行值填充列

2024-06-02 08:13:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个如下所示的数据帧

data_file= pd.DataFrame({'person_id':[1,1,1,1,2,2,2,3,3,3],'ob.date': [np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan,np.nan],
                 'observation': ['Age','interviewdate','marital_status','interviewdate','Age','interviewdate','marital_status','Age','interviewdate','marital_status'],
                 'answer': [21,'21/08/2017','Single','22/05/2217', 26,'11/03/2010','Single',41,'31/09/2012','Married']
                 })

enter image description here

我想做的是,从answer列获取date values,并将其放入ob.date列。提供的数据框显示person_id =121/08/2017回答了关于年龄的问题,在22/05/2017他回答了关于marital_status的问题

这是我根据另一个帖子的建议尝试的

s = data_file[(data_file.observation == 'interviewdate')].set_index('person_id')['answer']
data_file['ob.date'] = data_file['person_id'].map(s)

但这并不适用于我得到的duplicate index error。我怎样才能避免这个问题并使它足够有效?你知道吗

因此,任何优雅而有效的解决方案都会有所帮助。Person\u id=1有两个日期值,所以用interviewdate观察值的answer列中的值填充interviewdate观察值上方的所有行

我怎么能期望我的输出是这样的?你知道吗

enter image description here


Tags: 数据answeridagedatadatestatusnp
1条回答
网友
1楼 · 发布于 2024-06-02 08:13:34

全部取决于数据-首先按条件按answer设置新列,然后按组按前后填充重新计算缺少的值:

data_file['ob.date']  = data_file.loc[(data_file.observation == 'interviewdate'), 'answer']
data_file['ob.date'] = (data_file.groupby('person_id')['ob.date']
                                 .apply(lambda x: x.bfill().ffill()))


print (data_file)

   person_id     ob.date     observation      answer
0          1  21/08/2017             Age          21
1          1  21/08/2017   interviewdate  21/08/2017
2          1  22/05/2217  marital_status      Single
3          1  22/05/2217   interviewdate  22/05/2217
4          2  11/03/2010             Age          26
5          2  11/03/2010   interviewdate  11/03/2010
6          2  11/03/2010  marital_status      Single
7          3  31/09/2012             Age          41
8          3  31/09/2012   interviewdate  31/09/2012
9          3  31/09/2012  marital_status     Married

详细信息:

第一个用于对每个组进行倒排,因为interviewdate是边行-前面的所有值都是相同的子组。Last is add forwrd filling for repalce Last NaNs per groups-不替换为bfill

data_file['ob.date'] = (data_file.groupby('person_id')['ob.date']
                                   .apply(lambda x: x.bfill()))


print (data_file)

   person_id     ob.date     observation      answer
0          1  21/08/2017             Age          21
1          1  21/08/2017   interviewdate  21/08/2017
2          1  22/05/2217  marital_status      Single
3          1  22/05/2217   interviewdate  22/05/2217
4          2  11/03/2010             Age          26
5          2  11/03/2010   interviewdate  11/03/2010
6          2         NaN  marital_status      Single
7          3  31/09/2012             Age          41
8          3  31/09/2012   interviewdate  31/09/2012
9          3         NaN  marital_status     Married

相关问题 更多 >