如何在不使用for循环的情况下使用其他数据框创建列

时间:2020-05-05 03:20:44

标签: python pandas dataframe conditional-statements

我有一个主数据帧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中的每一行从ab,{基于cext_map的{​​{1}}中的{1}}与row.genre的标签相同。

[预期]

row.true

1 个答案:

答案 0 :(得分:2)

听起来像a的您应该能够将ext_mapdf的修改版本连接起来。这里有一些不错的文档:https://pandas.pydata.org/pandas-docs/stable/user_guide/merging.html

一个粗略的示例(执行此操作可能更简洁):

您可以使用true将数据从宽格式转换为长格式(枚举genrepd.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