如何按条件拆分数据集行并对比用户两次会话的分数变化
按用户拆分数据集并对比会话分数升降
步骤1:先补全缺失的用户ID
你的数据集里User列存在空值,第一步需要把这些空值填充为对应的用户ID,方便后续分组处理。用Python的pandas可以快速实现:
import pandas as pd # 构造你的数据集(如果是从文件读取,替换成pd.read_csv/Excel即可) df = pd.DataFrame({ 'User': [1, None, 2, None, 3, None, 4, None], 'Session': [1,2,1,2,1,2,1,2], 'Score': [4,5,5,3,4,5,3,3] }) # 向前填充缺失的User值 df['User'] = df['User'].ffill()
处理后每个行都会有对应的用户ID,数据集变成:
User Session Score
1 1 4
1 2 5
2 1 5
2 2 3
3 1 4
3 2 5
4 1 3
4 2 3
步骤2:按用户拆分数据集
如果需要把每个用户的数据单独拆分出来,可以用groupby生成分组字典:
# 按User分组,得到以用户ID为键的数据集字典 user_datasets = dict(tuple(df.groupby('User'))) # 比如提取用户1的数据集 user_1_data = user_datasets[1]
步骤3:对比两次会话的分数升降
因为每个用户只有两行数据,直接分组后提取第一次、最后一次会话的分数,判断变化即可:
def judge_score_change(group): # 按Session排序,确保会话1在前 sorted_group = group.sort_values('Session') first_score = sorted_group.iloc[0]['Score'] last_score = sorted_group.iloc[-1]['Score'] if last_score > first_score: return '上升' elif last_score < first_score: return '下降' else: return '持平' # 生成每个用户的分数对比结果 result = df.groupby('User').apply( lambda x: pd.Series({ '会话1分数': x[x['Session']==1]['Score'].values[0], '会话2分数': x[x['Session']==2]['Score'].values[0], '分数变化': judge_score_change(x) }) ).reset_index()
最终结果会是:
User 会话1分数 会话2分数 分数变化
1 4 5 上升
2 5 3 下降
3 4 5 上升
4 3 3 持平
额外:按条件调用指定行
如果需要直接提取特定条件的行,用布尔索引即可:
# 提取所有会话1的行 session1_rows = df[df['Session'] == 1] # 提取用户2的所有行 user2_rows = df[df['User'] == 2]
内容的提问来源于stack exchange,提问作者Sophie Martusewicz
相关产品推荐
相关产品推荐

