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

