【问题标题】:How to pass dataframes to a function using applymap() in pandas?如何在 Pandas 中使用 applymap() 将数据帧传递给函数?
【发布时间】:2017-06-06 11:00:26
【问题描述】:

我正在尝试在 pandas 中使用 applymap() 功能将函数应用于整个数据帧。我有一个数据框df(下面是它的一个示例):

Time    2010-08-31  2010-09-30  2010-10-31  2010-11-30  2010-12-31 2011-01-31  2011-02-28 2011-03-31  2011-04-30 
00:00   0.429188    0.302406    0.587415    0.227820    0.115938    0.170616    0.056256    0.078167    0.476515
00:30   0.340452    0.385037    0.218495    0.238118    0.134938    0.123279    0.054984    0.108111    0.173700
01:00   0.455451    0.433700    0.229352    0.253046    0.391425    0.313715    0.401116    0.123304    0.453640
01:30   0.601494    0.576142    0.425599    0.590769    0.486930    0.419002    0.560737    0.554705    0.544313
02:00   0.504342    0.584523    0.614539    0.375294    0.377951    0.342675    0.357372    0.367332    0.391336
02:30   0.527724    0.443303    0.457283    0.369515    0.392317    0.379410    0.391916    0.444807    0.491411
03:00   0.429236    0.531203    0.464098    0.370421    0.426875    0.360209    0.276282    0.179577    0.304990
03:30   0.442019    0.510604    0.314080    0.372268    0.443884    0.461649    0.390262    0.284042    0.417354

我还有另外两个框架,即df_peak 和df_off_peak,它们如下:

df_peak = pd.DataFrame(np.random.randn(20,2), columns=list(['Peak Consumption', 'Loss']))
df_off_peak = pd.DataFrame(np.random.randn(20,2), columns=list(['Off Peak Consumption', 'Loss']))

我在单独的文件interpolate.py中编写了以下函数:

计算消耗对应的损失函数

def cost_consump(consump,df_peak,df_off_peak):
    if(consump >= 0.459):
        for i in range(0, len(df_peak)):
            if(df_peak["Peak_Consumption"][i] > consump):
                cost = df_peak["Loss"][i-1]
                return cost        
                break;

    elif(consump <= 0.309):
        for i in range(0, len(df_off_peak)):
            if(df_off_peak["Off_Peak_Consumption"][i] > consump):
                cost = df_off_peak["Loss"][i-1]
                return cost        
                break;
    
    return 0

然后我调用函数cost_consump如下:

from interpolate import cost_consump
df1 = pd.DataFrame.copy(df,deep=True)

for i in range(0,48):
    for j in range(0,12):
        mean_consump = df.transpose().iloc[i,j]
        df1.transpose().iloc[i,j] =  cost_consump(mean_consump,df_loss_peak,df_loss_off_peak)

这完全符合我的要求。但是我很好奇这项工作是否可以通过使用applymap() 来完成。我尝试编写以下内容,我想将函数应用于数据帧df,并将结果操作保存在df1。

Monthly_mean_cost = Monthly_mean_consump.transpose().applymap(cost_consump(**df_loss_peak,**df_loss_off_peak))

但是,这需要我向函数传递两个额外的数据帧,我不知道该怎么做。

我将不胜感激。

【问题讨论】:

    标签: python pandas python-applymap


    【解决方案1】:

    我认为这是一个关于如何将参数传递给与applymap 一起使用的函数的一般问题。 Applymap 将数据框中每个系列中的每个元素传递给传递的函数。这会自动作为第一个参数传递。您可以编写一个包含第一个元素(下例中的x)和其他数据帧或参数的函数。

    要调用它,您可以使用 lambda 函数。下面是一个例子。

    import numpy as np
    import pandas as pd
    df  = pd.DataFrame(np.random.randn(3, 3))
    peak = pd.DataFrame(np.random.randn(3, 3))
    off_peak = pd.DataFrame(np.random.randn(3, 3))
    
    def applymapFunction(x, df1, df2):
        if x > 0.5:
            return x * df1.mean()[0]
        else:
            return x * df2.mean()[0]
    
    df.applymap(lambda x: applymapFunction(x, peak, off_peak))
    

    【讨论】:

      猜你喜欢
      • 2017-08-31
      • 1970-01-01
      • 2020-11-20
      • 2017-04-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 2021-05-09
      • 1970-01-01
      相关资源
      最近更新 更多