我怀疑这是Python中的一个非常基本的功能,我已经查看了可能已经有答案的问题下的建议,但我不认为这是一个重复的问题.我会删除它,如果是的话.
挑战:
我想在函数中包装df.groupby(pd.TimeGrouper(freq =’M’)).sum(),以便我可以将sum(),mean()或count()指定为该函数中的参数.我在here之前问了一个类似的问题,但我认为在这种特殊情况下我不能使用相同的技术.
这是一个可重复输入的片段:
# Imports
import pandas as pd
import numpy as np
# Dataframe with 1 or zero
# 100 rows and 4 columns
# Indexed by dates
np.random.seed(12345678)
df = pd.DataFrame(np.random.randint(0,2,size=(100, 4)), columns=list('ABCD'))
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=100).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
print(df.head(10))
这使:
有了这个,我们可以做到:
df2 = df.groupby(pd.TimeGrouper(freq='M')).sum()
print(df2)
得到:
或者我们可以这样做:
df3 = df.groupby(pd.TimeGrouper(freq='M')).mean()
print(df3)
得到:
这是包含在函数中的过程的一部分:
# My function
def function1(df):
df = df.groupby(pd.TimeGrouper(freq='M')).sum()
return df
# Function1 call
df4 = function1(df = df)
print(df4)
这很好用:
当我尝试在函数2中添加sum()或mean()作为参数时,会出现问题,如下所示:
# My function with sum() as an argument
def function2(df, fun):
df = df.groupby(pd.TimeGrouper(freq='M')).fun
return df
我的第一次尝试引发了一个TypeError:
# Function2 test 1
df5 = function2(df = df, fun = sum())
我的第二次尝试引发了属性错误:
# Function2 test 2
df6 = function2(df = df, fun = 'sum()')
是否可以对此设置进行一些调整以使其正常工作? (我尝试用’M’作为freq的参数的另一个版本,并且工作得很好).或者这不是这些事情的完成方式?
谢谢你的任何建议!
这是一个简单的复制和粘贴的整个混乱:
#%%
# Imports
import pandas as pd
import numpy as np
# Dataframe with 1 or zero
# 100 rows across 4 columns
# Indexed by dates
np.random.seed(12345678)
df = pd.DataFrame(np.random.randint(0,2,size=(100, 4)), columns=list('ABCD'))
datelist = pd.date_range(pd.datetime(2017, 1, 1).strftime('%Y-%m-%d'), periods=100).tolist()
df['dates'] = datelist
df = df.set_index(['dates'])
df.index = pd.to_datetime(df.index)
print(df.head(10))
# Calculate sum per month
df2 = df.groupby(pd.TimeGrouper(freq='M')).sum()
print(df2)
# Or calculate average per month
df3 = df.groupby(pd.TimeGrouper(freq='M')).mean()
print(df3)
# My function
def function1(df):
df = df.groupby(pd.TimeGrouper(freq='M')).sum()
return df
# Function1 test
df4 = function1(df = df)
print(df4)
# So far so good
#%%
# My function with sum() as argument
def function2(df, fun):
print(fun)
df = df.groupby(pd.TimeGrouper(freq='M')).fun
return df
# Function2 test 1
# df5 = function2(df = df, fun = sum())
# Function2 test 2
# df6 = function2(df = df, fun = 'sum()')
# Function2 test 3
# df7 = function2(df = df, fun = sum)
解决方法:
你需要使用申请
def function2(df, fun):
return df.groupby(pd.TimeGrouper(freq='M')).apply(fun)
只需确保fun是一个可调用的pd.DataFrame
但是,你应该使用agg.如果fun将列减少到类似于sum或mean的标量,那么这应该有效.需要考虑的事情.
df.groupby(pd.TimeGrouper('M')).agg(['sum', 'mean', fun])
标签:python,function,pandas
来源: https://codeday.me/bug/20190527/1163532.html