python - Pandas:通过从列表的字典映射创建一列
问题描述
我有一个熊猫数据框和一个字典,如下所示。我想根据行索引出现在字典中的哪个列表在数据框中创建一个新列。
df = pd.DataFrame({
'a':['x', 'y', 'z'],
'b':[1, 2, 3],
'c':[10, 20, 30],
})
df = df.set_index('a')
mydict = {
'g1':['a', 'b', 'y'],
'g2':['x', 'k', 'l'],
'g3':['m', 'l', 'z'],
}
预期产出
b c g
a
x 1 10 g2
y 2 20 g1
z 3 30 g3
我什至不知道如何开始解决这个问题。可以使用它创建自定义函数和地图吗?但这是否足够高效?在我的实际用例中,“df”中可能有数十万行,“mydict”中可能有大约数百个键,每个列表将包含数万个项目。此外,我将主要处理整数而不是字符串,如此处所示。
解决方案
您需要将列表字典展平为带有标量键的简单字典:值对。由于字典需要唯一的键,如果多个列表包含相同的值,则该值最终会映射到它所属的最后一个列表的键(这很好,因为您不在乎哪个)。
d = {val:key for key, lst in mydict.items() for val in lst}
#{'a': 'g1', 'b': 'g1', 'y': 'g1',
# 'x': 'g2', 'k': 'g2',
# 'l': 'g3', 'm': 'g3', 'z': 'g3'}
df['g'] = df.index.map(d)
# b c g
#a
#x 1 10 g2
#y 2 20 g1
#z 3 30 g3
推荐阅读
- android - 谁能建议如何在android Recycler View中实现按产品价格排序
- amazon-web-services - 允许 lambda 承担从身份池创建的 IAM 角色的角色?
- docker - 在 quay.io 中构建参数
- javascript - 如果用户选择日期,则 AJAX 发生错误
- python - 无法使用 folium add_child 创建点
- dart - 无法在颤振中运行我的第一个应用程序
- html - 如何从我的网页中删除 Bootstrap 缩略图
- python - 将numpy中的单列JSON拆分为多列数组
- tensorflow - ValueError:形状必须为 2 级,但对于输入形状为 [6]、[6] 的“MatMul”(操作:“MatMul”)为 1 级
- apache-kafka - 如何从 Spark 结构化流中的特定 Kafka 分区中读取数据