无需循环将DataFrame中的字典转换为新表并生成指定列
当然有不用手动写循环的办法!用Pandas自带的apply方法结合字典操作就能轻松搞定,代码简洁还比手动循环高效。
先给你举个具体的例子,假设你的DataFrame长这样:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'code': [123, 456], 'people': [ {'Alice': 165, 'Bob': 180, 'Charlie': 175}, {'David': 170, 'Eve': 185, 'Frank': 178} ] })
接下来直接用两行代码就能生成你要的两列:
# 提取身高最高的人物名称 df['highest_guy'] = df['people'].apply(lambda x: max(x, key=x.get)) # 提取对应的身高数值 df['highest_guy_size'] = df['people'].apply(lambda x: max(x.values()))
解释一下这两行的逻辑:
max(x, key=x.get):针对每行的字典x,x.get会返回键对应的值,max函数会根据这个值的大小,返回最大的那个键(也就是身高最高的人)max(x.values()):直接取字典里所有值的最大值,也就是最高的身高数值
处理后的结果就是你想要的格式:
code people highest_guy highest_guy_size 0 123 {'Alice': 165, 'Bob': 180, 'Charlie': 175} Bob 180 1 456 {'David': 170, 'Eve': 185, 'Frank': 178} Eve 185
如果你的数据量很大,还可以试试另一种写法(不过这种适合字典键比较规整的情况):
# 把字典转成Series后取索引最大值和数值最大值 people_df = df['people'].apply(pd.Series) df['highest_guy'] = people_df.idxmax(axis=1) df['highest_guy_size'] = people_df.max(axis=1)
两种方法都不用写显式的for循环,Pandas内部会做优化处理,比手动遍历行效率高不少。
内容的提问来源于stack exchange,提问作者aabujamra
相关产品推荐
相关产品推荐

