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
相关产品推荐
相关产品推荐

