如何为Pandas DataFrame添加列,填充对应球队列表的最后元素?
问题描述
我有如下Pandas DataFrame:
0 1 2 3 Teams Lakers 0 15 10 53 Warriors 92 100 36 45 Celtics 32 66 67 57 Rockets 96 18 15 98 Bucks 66 85 2 69 Nets 16 84 61 83 Clippers 59 8 1 54 Jazz 56 52 33 86 Heat 78 90 88 81 Suns 45 16 29 3 Bulls 52 57 77 18
可通过以下代码重建:
import pandas as pd data = {'Teams': {0: 'Lakers', 1: 'Warriors', 2: 'Celtics', 3: 'Rockets', 4: 'Bucks', 5: 'Nets', 6: 'Clippers', 7: '76ers', 8: 'Jazz', 9: 'Heat', 10: 'Suns', 11: 'Bulls'}, 0: {0: 0, 1: 92, 2: 32, 3: 96, 4: 66, 5: 16, 6: 59, 7: 93, 8: 56, 9: 78, 10: 45, 11: 52}, 1: {0: 15, 1: 100, 2: 66, 3: 18, 4: 85, 5: 84, 6: 8, 7: 99, 8: 52, 9: 90, 10: 16, 11: 57}, 2: {0: 10, 1: 36, 2: 67, 3: 15, 4: 2, 5: 61, 6: 1, 7: 54, 8: 33, 9: 88, 10: 29, 11: 77}, 3: {0: 53, 1: 45, 2: 57, 3: 98, 4: 69, 5: 83, 6: 54, 7: 51, 8: 86, 9: 81, 10: 3, 11: 18}} df = pd.DataFrame.from_dict(data)
同时每个球队对应一个字母列表:
Lakers = ['U', 'G', 'O', 'Q', 'A'] Warriors = ['X', 'P', 'E', 'S', 'O'] Celtics = ['U', 'T', 'F', 'H', 'Q'] Rockets = ['V', 'C', 'Z', 'T', 'G'] Bucks = ['M', 'P', 'V', 'C', 'O'] Nets = ['V', 'K', 'Q', 'D', 'M'] Clippers = ['U', 'B', 'C', 'Z', 'R'] Jazz = ['I', 'S', 'C', 'L', 'T'] Heat = ['M', 'A', 'A', 'Q', 'F'] Suns = ['Z', 'S', 'F', 'L', 'O'] Bulls = ['W', 'C', 'T', 'P', 'E']
我想创建列4,将对应球队列表的最后一个元素填入(比如Lakers对应'A',Bucks对应'O')。尝试了以下代码但所有字段都被填充为同一个字母:
n = 0 for _ in range(len(df)): for t in team_list: if t == df.iloc[n, 0]: df['4'] = t[-1] n += 1
错误原因
你的代码中df['4'] = t[-1]会直接将整个列替换为当前的t[-1]值,循环到最后一次时,所有行都会被覆盖成最后一个匹配到的字母。
正确解法
方法1:字典映射(最推荐)
先构建球队与对应列表最后一个字母的映射字典,再用map生成新列:
# 构建球队到最后一个字母的映射字典 team_last_letter = { 'Lakers': Lakers[-1], 'Warriors': Warriors[-1], 'Celtics': Celtics[-1], 'Rockets': Rockets[-1], 'Bucks': Bucks[-1], 'Nets': Nets[-1], 'Clippers': Clippers[-1], 'Jazz': Jazz[-1], 'Heat': Heat[-1], 'Suns': Suns[-1], 'Bulls': Bulls[-1], '76ers': '' # 原DataFrame包含76ers,可按需补全对应值 } # 生成新列 df['4'] = df['Teams'].map(team_last_letter)
方法2:修复循环代码
若坚持使用循环,需给对应行赋值而非整个列:
# 初始化新列为空 df['4'] = '' # 构建球队到对应列表的字典 team_dict = { 'Lakers': Lakers, 'Warriors': Warriors, 'Celtics': Celtics, 'Rockets': Rockets, 'Bucks': Bucks, 'Nets': Nets, 'Clippers': Clippers, 'Jazz': Jazz, 'Heat': Heat, 'Suns': Suns, 'Bulls': Bulls, '76ers': [] } for index, row in df.iterrows(): team_name = row['Teams'] if team_name in team_dict and team_dict[team_name]: df.loc[index, '4'] = team_dict[team_name][-1]
方法3:apply函数
利用apply结合lambda函数实现:
# 构建球队到对应列表的字典 team_dict = { 'Lakers': Lakers, 'Warriors': Warriors, 'Celtics': Celtics, 'Rockets': Rockets, 'Bucks': Bucks, 'Nets': Nets, 'Clippers': Clippers, 'Jazz': Jazz, 'Heat': Heat, 'Suns': Suns, 'Bulls': Bulls, '76ers': [] } df['4'] = df['Teams'].apply(lambda x: team_dict[x][-1] if (x in team_dict and team_dict[x]) else '')
内容的提问来源于stack exchange,提问作者zum809
相关产品推荐
相关产品推荐

