我有一个主数据框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
of ext_map
basedrow.genre
并且row.true
与标签相同ext_map
。
[预期的]
true billed genre new_col
0 1 4 a 1.1
1 2 5 b 2.3
2 3 6 c 3.3
像一个声音,你应该能够加入一个修改版本的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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句