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

Pandas赋值报错:值长度与索引不匹配问题求助

问题解决:为player_df添加categories_id列

错误原因

你写的循环会遍历所有游戏和玩家的组合,每找到一个匹配就往new_list里添加一个id_category,最终得到6个元素,但player_df只有3行,赋值时自然会出现长度不匹配的报错。核心问题是一个玩家可能对应多个游戏的分类ID,你需要为每个玩家收集所有匹配的分类,而不是把所有匹配结果堆成一个长列表。

解决方案

方案1:基于game_name与indication的匹配

使用apply函数,对每个玩家的indication字段,找出所有匹配的游戏分类ID,最终生成对应玩家的分类列表:

import pandas as pd
dict1 = {'id_game': [112, 113, 114], 'game_name' : ['x','z','y'],'id_category':[1,2,3], 'id_players':[[588,589,590],[589],[588,589]]}
dict2 = {'id_player': [588, 589, 590],'player_name' : ['fff','aaa','ccc'] ,'indication':['mmm x ggg sdg y', 'uuu x fdb y kfnkjq z', 'fffre x']}
game_df = pd.DataFrame(dict1)
player_df = pd.DataFrame(dict2)

# 为每个玩家匹配对应的分类ID
player_df['categories_id'] = player_df['indication'].apply(
    lambda text: [game_df.loc[game_df['game_name'] == name, 'id_category'].iloc[0] 
                  for name in game_df['game_name'] if name in text]
)

print(player_df)

运行结果中,categories_id列会是每个玩家匹配到的分类ID列表,比如玩家aaa的indication包含x、y、z,对应分类[1,3,2]。

方案2:基于id_players与id_player的关联

先将game_df中嵌套的id_players列表展开,再通过id_player关联合并,最后聚合每个玩家的分类ID:

import pandas as pd
dict1 = {'id_game': [112, 113, 114], 'game_name' : ['x','z','y'],'id_category':[1,2,3], 'id_players':[[588,589,590],[589],[588,589]]}
dict2 = {'id_player': [588, 589, 590],'player_name' : ['fff','aaa','ccc'] ,'indication':['mmm x ggg sdg y', 'uuu x fdb y kfnkjq z', 'fffre x']}
game_df = pd.DataFrame(dict1)
player_df = pd.DataFrame(dict2)

# 展开game_df中的玩家ID列表
expanded_game = game_df.explode('id_players').rename(columns={'id_players': 'id_player'})
# 合并数据并聚合分类ID
player_df = player_df.merge(expanded_game[['id_player', 'id_category']], 
                            on='id_player', how='left')
player_df = player_df.groupby(['id_player', 'player_name', 'indication'], as_index=False)['id_category'].agg(list)
player_df = player_df.rename(columns={'id_category': 'categories_id'})

print(player_df)

这种方式更直接基于玩家ID关联,避免了文本匹配的潜在误差(比如indication中出现类似xyz的字符串会误匹配x或z)。

可选调整:将分类ID转为字符串(非列表)

如果你希望categories_id是用分隔符拼接的字符串而非列表,可以把agg(list)改成agg(lambda x: ','.join(map(str, x))),或者在方案1的apply中用','.join(...)包裹列表。

内容的提问来源于stack exchange,提问作者NewComer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 07:36:22