根据条件从另一个数据框列获取值

时间:2019-04-04 09:27:59

标签: python-3.x pandas

我有一个如下数据框:

>>> df1
           a   b
0  [1, 2, 3]  10
1  [4, 5, 6]  20
2     [7, 8]  30

和另一个类似:

>>> df2
   a
0  1
1  2
2  3
3  4
4  5

如果df2的列'a'值位于行列'a'df1中,则需要从df1的列'b'中创建df2列'c'。在df1中,列“ a”的每个元组都是一个列表。

我尝试通过以下网址实施,但到目前为止没有任何帮助: https://medium.com/@Imaadmkhan1/using-pandas-to-create-a-conditional-column-by-selecting-multiple-columns-in-two-different-b50886fabb7d

预期结果是

>>> df2
   a  c
0  1 10
1  2 10
2  3 10
3  4 20
4  5 20

3 个答案:

答案 0 :(得分:4)

使用:

m=pd.DataFrame({'a':np.concatenate(df.a.values),'b':df.b.repeat(df.a.str.len())})
df2.merge(m,on='a')

   a   b
0  1  10
1  2  10
2  3  10
3  4  20
4  5  20

答案 1 :(得分:4)

通过将df1的值展平到字典来使用Series.map

d = {c: b for a, b in zip(df1['a'], df1['b']) for c in a}
print (d)
{1: 10, 2: 10, 3: 10, 4: 20, 5: 20, 6: 20, 7: 30, 8: 30}

df2['new'] = df2['a'].map(d)
print (df2)
   a  new
0  1   10
1  2   10
2  3   10
3  4   20
4  5   20

编辑:我认为问题是a列中列表中的混合整数,解决方案是使用if / else测试新字典:

d = {}
for a, b in zip(df1['a'], df1['b']):
    if isinstance(a, list):
        for c in a:
            d[c] = b
    else:
        d[a] = b

df2['new'] = df2['a'].map(d)

答案 2 :(得分:2)

首先我们将列表df1 unnest行,然后将它们合并到列a上:

df1 = df1.set_index('b').a.apply(pd.Series).stack().reset_index(level=0).rename(columns={0:'a'})
print(df1, '\n')

df_final = df2.merge(df1, on='a')
print(df_final)

    b    a
0  10  1.0
1  10  2.0
2  10  3.0
0  20  4.0
1  20  5.0
2  20  6.0
0  30  7.0
1  30  8.0 

   a   b
0  1  10
1  2  10
2  3  10
3  4  20
4  5  20