在列表理解内子集数据框

时间:2018-12-31 16:19:27

标签: python pandas list-comprehension

我有两个pandas.DataFrame,它们共享一些列。我想基于另一个中的共享信息来附加一个中的数据。问题在于这些是非常庞大的数据集,我将需要使用几对表多次运行这些行。因此,它必须非常快。 我的数据框如下所示:

import pandas as pd

mat = pd.DataFrame({'ID':[1,2,3,4,5],'OTHER_ID':[6,7,8,9,10]})
sess= pd.DataFrame({'ID':[11,12,13,14,15],'MAT_ID':[6,7,8,1,2]})

我可以使用地图做我想做的事情,

sess['NEWCOLUMN']=list(map(lambda x:mat[mat['ID']==x]['OTHER_ID'],sess['MAT_ID']))

但是我想通过列表理解来做到这一点,因为它更快。这是我尝试过的:

sess['NEWCOLUMN']=[x for x in sess['MAT_ID'] mat[mat['ID']==x]['OTHER_ID']]

但是,我遇到语法错误。我知道我可以使用常规的for循环来做到这一点,但这不是我想要的。 我可以通过列表理解来做到这一点吗?如果可以,怎么办?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,则可以使用以下列表理解:

import pandas as pd

mat = pd.DataFrame({'ID':[1,2,3,4,5],'OTHER_ID':[6,7,8,9,10]})
sess= pd.DataFrame({'ID':[11,12,13,14,15],'MAT_ID':[6,7,8,1,2]})

sess['NEWCOLUMN']= [mat[mat['ID']==x]['OTHER_ID'] for x in sess['MAT_ID']]
print(sess)

答案 1 :(得分:1)

您可以使用地图而无需循环

sess['NEWCOLUMN'] = sess['MAT_ID'].map(mat.set_index('OTHER_ID').ID)


    ID  MAT_ID  NEWCOLUMN
0   11  6       1.0
1   12  7       2.0
2   13  8       3.0
3   14  1       NaN
4   15  2       NaN