Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.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 熊猫:将Lambda应用于多个数据帧_Python_Memory_Pandas_Lambda_Dataframe - Fatal编程技术网

Python 熊猫:将Lambda应用于多个数据帧

Python 熊猫:将Lambda应用于多个数据帧,python,memory,pandas,lambda,dataframe,Python,Memory,Pandas,Lambda,Dataframe,我试图弄清楚如何将lambda函数同时应用于多个数据帧,而不必首先将数据帧合并在一起。我正在处理大数据集(>60MM记录),我需要特别小心内存管理 我希望有一种方法可以将lambda应用于底层数据帧,这样我就可以避免先将它们缝合在一起,然后在进入下一步之前从内存中删除中间数据帧的成本 我有使用基于HDF5的数据帧来避免内存不足的经验,但我宁愿先尝试探索一些不同的东西 我提供了一个玩具问题来帮助演示我所说的内容 import numpy as np import pandas as pd # H

我试图弄清楚如何将lambda函数同时应用于多个数据帧,而不必首先将数据帧合并在一起。我正在处理大数据集(>60MM记录),我需要特别小心内存管理

我希望有一种方法可以将lambda应用于底层数据帧,这样我就可以避免先将它们缝合在一起,然后在进入下一步之前从内存中删除中间数据帧的成本

我有使用基于HDF5的数据帧来避免内存不足的经验,但我宁愿先尝试探索一些不同的东西

我提供了一个玩具问题来帮助演示我所说的内容

import numpy as np
import pandas as pd

# Here's an arbitrary function to use with lambda
def someFunction(input1, input2, input3, input4):
    theSum = input1 + input2
    theAverage = (input1 + input2 + input3 + input4) / 4
    theProduct = input2 * input3 * input4
    return pd.Series({'Sum' : theSum, 'Average' : theAverage, 'Product' : theProduct})

# Cook up some dummy dataframes
df1 = pd.DataFrame(np.random.randn(6,2),columns=list('AB'))
df2 = pd.DataFrame(np.random.randn(6,1),columns=list('C'))
df3 = pd.DataFrame(np.random.randn(6,1),columns=list('D'))

# Currently, I merge the dataframes together and then apply the lambda function
dfConsolodated = pd.concat([df1, df2, df3], axis=1)

# This works just fine, but merging the dataframes seems like an extra step
dfResults = dfConsolodated.apply(lambda x: someFunction(x['A'], x['B'], x['C'], x['D']), axis = 1)

# I want to avoid the concat completely in order to be more efficient with memory. I am hoping for something like this:
# I am COMPLETELY making this syntax up for conceptual purposes, my apologies.
dfResultsWithoutConcat = [df1, df2, df3].apply(lambda x: someFunction(df1['A'], df1['B'], df2['C'], df3['D']), axis = 1)

一种选择是显式创建所需的聚合:

theSum = df1.A + df1.B
theAverage = (df1.A + df1.B + df2.C + df3.D) / 4.
theProduct = df1.B * df2.C * df3.D
theResult = pd.concat([theSum, theAverage, theProduct])
theResult.columns = ['Sum', 'Average', 'Product']
另一种可能性是使用,但这实际上取决于您的用例和您打算如何聚合数据。以下是可能适用于您的每个文档的示例

map(lambda frame: frame.query(expr), [df, df2])

我知道这个问题有点老了,但我想出了一个办法。 这不太好,但很管用

基本思想是查询应用函数中的第二个数据帧。 通过使用传递序列的名称,您可以识别列/索引,并使用它从其他数据帧检索所需的值


很难理解这是否值得回答,因为您当前的问题可以在不应用lambda和串联的情况下解决,您能解释一下您真正想要实现的目标吗?在我的示例代码中,我从三个数据帧开始[df1,df2,df3]。然后,我需要创建一个名为dfConsolodated的中间数据帧,它只是将三个底层数据帧连接在一起。这对于玩具问题来说没什么问题,但是当我在每个数据帧上操作超过6000万条记录时,我可以使用dfConsolodated表快速地增加内存。真正的目标,首先是通过避免concat来节省系统资源。所有的数据帧都是相同的形状吗?在某种程度上,它们有相同的索引。它们在垂直方向上高度相同,但宽度可能不同。如果内存是您的约束条件,则可以通过连接数据帧来坚持原始工作流。但是,请尝试分批处理它们(例如,1m行),然后连接结果。这在示例中有效,因为我的示例中的数学很简单。实际上,我使用的是一个更复杂的统计模型,它使用了一些数值积分。我不认为我可以通过显式地创建聚合而逃脱惩罚。由于模型的复杂性,我认为我一直坚持将数据传递到函数参数中。我应该提到的是,查询的想法值得研究,多亏了这个想法,我将尝试一下。回到我最初的问题,是否可以跨多个单独的数据帧使用lambda?我注意到你是一个财务人员。实际上,我正在创建一个由每日期权头寸的时间序列组成的大型数据框架,并通过欧洲black-scholes模型对其进行定价,以获得价格和所有典型的希腊人。然后,我计算希腊的每日损益归属,以获得归因于所有相关敏感性的每日损益时间序列。我无法通过显式创建聚合来运行BS,正如您前面提到的。
def func(x, other):
    other_value = other.loc[x.name]
    return your_actual_method(x, other_value)

result = df1.apply(lambda x: func(x, df2))