如何使用 pandas 中的 applymap() 将数据帧传递给函数?
How to pass dataframes to a function using applymap() in pandas?
我正在尝试使用 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))
但是,这需要我将两个额外的数据帧传递给函数,但我不确定该怎么做。
如有任何帮助,我将不胜感激。
我认为这是一个关于如何将参数传递给与 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))
我正在尝试使用 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))
但是,这需要我将两个额外的数据帧传递给函数,但我不确定该怎么做。
如有任何帮助,我将不胜感激。
我认为这是一个关于如何将参数传递给与 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))