如何随DataFrame内容变化更新字典键值对?
解决DataFrame迭代更新字典的问题
我来帮你搞定这个根据每次变化的DataFrame更新字典的需求~
先理清楚你的场景
你每次会拿到一个只包含一行color和name的DataFrame,想要把color作为键、name作为值逐步添加到字典里,最终得到包含所有历史数据的字典对吧?
为什么你原来的写法会有问题
你尝试的dict.update({df['color'] : df['name']})其实行不通,因为df['color']和df['name']是Pandas的Series对象,不是单个的字符串值,直接这么写会把整个Series塞进字典,完全不是你想要的结果。
正确的解决方法
下面给你几种实用的写法,按需选择:
方法1:提取单个值后用update更新
先从单行DataFrame里把color和name的具体值取出来,再更新字典:
# 先初始化一个空字典 my_dict = {} # 第一次迭代的DataFrame df1 = pd.DataFrame({'color': ['red'], 'name': ['Jim']}) # 用.iloc[0]拿到第一行的对应列值(因为每次只有一行) my_dict.update({df1['color'].iloc[0]: df1['name'].iloc[0]}) # 这时候my_dict就是 {'red': 'Jim'} # 第二次迭代的DataFrame df2 = pd.DataFrame({'color': ['green'], 'name': ['Pam']}) my_dict.update({df2['color'].iloc[0]: df2['name'].iloc[0]}) # 最终就得到你想要的 {'red': 'Jim', 'green': 'Pam'}
方法2:更简洁的直接赋值
如果确定每次的DataFrame只有一行,直接用字典赋值的方式更清爽:
my_dict = {} # 第一次更新 df1 = pd.DataFrame({'color': ['red'], 'name': ['Jim']}) my_dict[df1['color'].iloc[0]] = df1['name'].iloc[0] # 第二次更新 df2 = pd.DataFrame({'color': ['green'], 'name': ['Pam']}) my_dict[df2['color'].iloc[0]] = df2['name'].iloc[0]
方法3:扩展场景——处理多行DataFrame
要是某次迭代拿到的DataFrame有多行数据,也可以一键转换后合并:
# 比如这次拿到两行数据 df_multi = pd.DataFrame({'color': ['blue', 'yellow'], 'name': ['Dwight', 'Michael']}) # 先把df转成{color:name}格式的字典,再合并到原字典 my_dict.update(df_multi.set_index('color')['name'].to_dict()) # 这时候my_dict会新增两个键值对:'blue':'Dwight'、'yellow':'Michael'
小提醒
如果后续遇到重复的color值,字典会自动覆盖之前对应的name——这是字典的特性。要是你想保留所有历史值,可以把字典的value改成列表,每次append新值就行啦~
内容的提问来源于stack exchange,提问作者MaxB
相关产品推荐
相关产品推荐

