如何合并含字符串日期与None的列并实现单用户单行数据
合并用户的抵达/离开日期记录
问题背景
现有如下Pandas DataFrame,每个用户对应两行数据:每行包含arrival(抵达日期)和departure(离开日期)字段,其中必有一个字段值为None,日期为字符串格式。
原始数据表格
| traveller_id | arrival | departure |
|---|---|---|
| 282840560712311 | 2022-10-20 | None |
| 282840560712311 | None | 2022-10-23 |
| 439863739170884 | 2022-12-22 | None |
| 439863739170884 | None | 2022-12-25 |
生成原始数据的代码
import pandas as pd import numpy as np df = pd.DataFrame( data={ 'traveller_id': [712311, 712311, 170884, 170884], 'arrival': ['2022-10-20', None, '2022-12-22', None], 'departure': [None, '2022-10-23', None, '2022-12-25'] } )
需求
将每个用户的记录合并为一行,填充arrival和departure字段的有效日期,确保最终结果无None值,目标结果如下:
目标数据表格
| traveller_id | arrival | departure |
|---|---|---|
| 282840560712311 | 2022-10-20 | 2022-10-23 |
| 439863739170884 | 2022-12-22 | 2022-12-25 |
解决方案
可以通过按traveller_id分组后提取非空值的方式实现合并:
方法1:使用groupby + first
由于每个用户的每个字段仅存在一个非空值,first()会自动提取该有效日期:
result_df = df.groupby('traveller_id', as_index=False).first()
方法2:自定义聚合逻辑
如果需要更明确的处理规则,可通过agg指定每个字段的提取方式:
result_df = df.groupby('traveller_id', as_index=False).agg( arrival=('arrival', lambda x: x.dropna().iloc[0]), departure=('departure', lambda x: x.dropna().iloc[0]) )
运行上述代码后,result_df将呈现目标表格样式,每个用户仅保留一行,且所有日期字段均为有效值。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

