You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas数据重塑:按id和date分组透视测试成绩并过滤缺失测试项的记录

Pandas数据重塑:按id和date分组透视测试成绩并过滤缺失测试项的记录

嗨,我来帮你搞定这个需求!你想要把长格式的测试数据转成宽格式,同时只保留在同一id和date下同时拥有testA和testB的记录对吧?下面是具体的实现步骤:

1. 先构造你的原始数据集

首先咱们先把你给出的数据转换成Pandas DataFrame:

import pandas as pd

data = {
    'id': [1, 1, 1, 1, 2, 2, 3, 4],
    'test': ['A', 'B', 'A', 'B', 'A', 'B', 'A', 'A'],
    'score': [1, 3, 1, 5, 2, 4, 6, 2],
    'date': ['2000-01-01', '2000-01-01', '2000-01-30', '2000-01-30', 
             '2000-01-01', '2000-01-01', '2000-01-01', '2000-01-01']
}
df = pd.DataFrame(data)

2. 数据透视+过滤缺失项

我们可以用pivot_table(或者pivot,这里用pivot_table更稳妥,能处理潜在的重复值)来重塑数据,然后过滤掉缺少任一测试项的记录:

# 透视数据:按id和date分组,把test的不同值转成列,对应score
pivoted_df = df.pivot_table(
    index=['id', 'date'],  # 分组依据
    columns='test',        # 要转成列的字段
    values='score',        # 对应的值字段
    aggfunc='first'        # 因为同一组内没有重复,取第一个值即可
).reset_index()  # 把id和date从索引转回普通列

# 过滤掉有缺失测试项的行,并重命名列名
df_outcome = pivoted_df.dropna().rename(columns={'A': 'testA', 'B': 'testB'})

如果你确认你的数据中没有重复的id-date-test组合,也可以用更简洁的pivot方法:

df_outcome = df.pivot(index=['id', 'date'], columns='test', values='score')\
               .reset_index()\
               .dropna()\
               .rename(columns={'A': 'testA', 'B': 'testB'})

3. 查看结果

运行上面的代码后,df_outcome就是你想要的结果:

id        date  testA  testB
0   1  2000-01-01    1.0    3.0
1   1  2000-01-30    1.0    5.0
2   2  2000-01-01    2.0    4.0

为什么id=3和4被排除?

因为这两个id在对应的日期下只存在testA,没有testB,透视后testB列会是NaN,dropna()方法会自动把这些包含缺失值的行过滤掉,正好符合你只保留同时有两种测试记录的要求。

备注:内容来源于stack exchange,提问作者Economist_Ayahuasca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 13:17:40