我有一个主数据帧df
和另一个数据帧ext_map
:
df = pd.DataFrame(data={'true': [1, 2, 3], 'billed': [4, 5, 6], 'genre':['a','b','c']})
true billed genre
0 1 4 a
1 2 5 b
2 3 6 c
ext_map = pd.DataFrame(data={'label':[1,2,3], 'a':[1.1,1.2,1.3], 'b':[2.1,2.2,2.3],'c':[3.1,3.2,3.3]})
label a b c
0 1 1.1 2.1 3.1
1 2 1.2 2.2 3.2
2 3 1.3 2.3 3.3
我想在主数据帧中创建一个新列new_col
,以便为df
中的每一行从a
,b
,{基于c
和ext_map
的{{1}}中的{1}}与row.genre
的标签相同。
[预期]
row.true
答案 0 :(得分:2)
听起来像a的您应该能够将ext_map
到df
的修改版本连接起来。这里有一些不错的文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html
一个粗略的示例(执行此操作可能更简洁):
您可以使用true
将数据从宽格式转换为长格式(枚举genre
和pd.melt()
的每种组合)
temp = ext_map.melt(id_vars=['label'], value_vars=['a', 'b', 'c'], var_name='genre', value_name = 'new_col')
产生以下结果:
label genre new_col
0 1 a 1.1
1 2 a 1.2
2 3 a 1.3
3 1 b 2.1
4 2 b 2.2
5 3 b 2.3
6 1 c 3.1
7 2 c 3.2
8 3 c 3.3
然后使用pd.merge()
通过您提到的查找方法来连接数据框:
df.merge(temp, left_on = ['true', 'genre'], right_on = ['label', 'variable'])
为您提供此结果:
true billed genre label variable new_col
0 1 4 a 1 a 1.1
1 2 5 b 2 b 2.2
2 3 6 c 3 c 3.3