Python pandas拆分Members列并统计各成员首次及末次出现日期
问题原因分析
- 拆分得到全NaN的核心原因:你的
Members列存储的是带方括号的字符串格式列表,不是原生Python列表,拆分前没有先处理掉首尾的[、]符号,同时部分成员前后带空格,也会影响拆分结果;另外如果Members列的数据类型不是字符串,也会导致str类方法失效返回NaN。 - 你当前的写法会直接覆盖原df,丢失
Date列,后续无法统计成员的出现日期。
完整实现步骤
按照以下代码执行即可得到你要的结果:
- 第一步:预处理Members列,清洗无效符号
import pandas as pd # 确保Members列是字符串类型,去掉首尾的方括号 df['Members'] = df['Members'].astype(str).str.strip('[]') # 按逗号拆分,同时去除每个成员前后的多余空格,得到列表格式 df['Members'] = df['Members'].str.split(',').apply(lambda x: [item.strip() for item in x])
- 第二步:将每行的成员列表展开为多行,每个成员单独占一行
# explode方法实现列表展开,保留对应日期 df_explode = df.explode('Members', ignore_index=True)
- 第三步:按成员分组聚合,统计首次和末次出现日期
# 先将Date列转为日期格式,保证统计准确 df_explode['Date'] = pd.to_datetime(df_explode['Date']) # 分组统计最小日期(首次)和最大日期(末次) result = df_explode.groupby('Members', as_index=False).agg( 首次出现日期=('Date', 'min'), 末次出现日期=('Date', 'max') ) # 若需要输出为字符串格式日期,可加下面这行代码 result[['首次出现日期', '末次出现日期']] = result[['首次出现日期', '末次出现日期']].apply(lambda col: col.dt.strftime('%Y-%m-%d'))
结果示例
以你提供的测试数据运行后,输出的result结构如下:
| Members | 首次出现日期 | 末次出现日期 |
|---|---|---|
| CHRW.OQ | 2009-01-30 | 2009-03-30 |
| AJG.N | 2009-01-30 | 2009-03-30 |
| CNP.N | 2009-01-30 | 2009-03-30 |
| 其余成员以此类推 | ... | ... |
内容的提问来源于stack exchange,提问作者bencolo
相关产品推荐
相关产品推荐

