创建一个数据框列,其中包含来自另一个数据框的匹配值列表

时间:2019-05-08 19:05:32

标签: python python-3.x pandas

我试图创建一个熊猫数据框列(在df1中),其中每个元素都是与df1中现有列匹配的另一个数据框(df2)中所有值的列表。这与大熊猫左合并不同,因为该函数每次在df2中复制df1值时都会创建新行。

我的代码完全可以满足我的需要,但是它非常慢(在大型数据框上),而且我几乎可以肯定有一个内置的pandas方法可以满足我的需求,但是我还没有找不到它。

这是我当前代码的简化版本。

import pandas as pd
df1=pd.DataFrame({'col4': [1,2,3,4,5,6]})
df2=pd.DataFrame({'col2':['a','b','c','d','e','f','g'],'col3':[1,1,2,3,4,4,6]})
df1['col1']=pd.Series(list(df2['col2'][df2['col3']==df1['col4'][i]]) for i in df1.index)

有没有一种方法可以使用pandas apply方法或类似的方法来代替在df1.index上进行迭代?谢谢!

3 个答案:

答案 0 :(得分:2)

尝试:

df1.set_index('col4', inplace=True)
df1['col4'] = df2.groupby('col3').col2.apply(list)
df1.reset_index(drop=True, inplace=True)

答案 1 :(得分:1)

这实际上是一个merge问题,但是您还需要groupby并从组中创建列表:

match /databases/{database}/documents

答案 2 :(得分:1)

这可能会带给您大部分的帮助,但是我认为效率低下的原因可能仍然存在,因为尝试将列表存储在DataFrame中。我想您可能想研究一下MultiIndex,但是我不确定您的用例是什么。

import pandas as pd
df1 = pd.DataFrame({'col4': [1,2,3,4,5,6]})
df2 = pd.DataFrame({'col2':['a','b','c','d','e','f','g'],'col3':[1,1,2,3,4,4,6]})
result = df1.join(df2.groupby('col3').agg(list), on='col4')