Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用来自另一个数据帧的匹配值列表创建数据帧列_Python_Python 3.x_Pandas - Fatal编程技术网

Python 使用来自另一个数据帧的匹配值列表创建数据帧列

Python 使用来自另一个数据帧的匹配值列表创建数据帧列,python,python-3.x,pandas,Python,Python 3.x,Pandas,我试图创建一个数据帧列(在df1中),其中每个元素都是来自另一个数据帧(df2)的所有值的列表,这些值与df1中现有的列相匹配。这与左合并不同,因为每次在df2中复制df1值时,该函数都会创建新行 我有完全符合我需要的代码,但它非常慢(在我的大数据帧上),我几乎可以肯定有一个内置的pandas方法来完成我正在寻找的任务,但我一直无法找到它 这是我当前代码的简化版本 import pandas as pd df1=pd.DataFrame({'col4': [1,2,3,4,5,6]}) df2=

我试图创建一个数据帧列(在df1中),其中每个元素都是来自另一个数据帧(df2)的所有值的列表,这些值与df1中现有的列相匹配。这与左合并不同,因为每次在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?谢谢

试试看:

df1.set_index('col4', inplace=True)
df1['col4'] = df2.groupby('col3').col2.apply(list)
df1.reset_index(drop=True, inplace=True)
这实际上是一个问题,但是您还需要从组中创建列表:

(df1.merge(df2, left_on='col4', right_on='col3', how='right')
    .groupby('col3').col2
    .apply(list))

      col3
1    [a, b]
2       [c]
3       [d]
4    [e, f]
6       [g]
Name: col2, dtype: object

这可能会让您在大部分时间内达到目的,但我相信效率低下可能仍然存在,因为您试图在数据框中存储列表。我认为您可能想研究多索引,但我不确定您的用例是什么

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')