gpt4 book ai didi

python - Pandas:如何在函数内将 sum() 或 mean() 分配给 df.groupby?

转载 作者:太空狗 更新时间:2023-10-30 02:26:16 26 4
gpt4 key购买 nike

我想将 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))

给出:

enter image description here

有了这个我们可以做到:

df2 = df.groupby(pd.TimeGrouper(freq='M')).sum()
print(df2)

并得到:

enter image description here

或者我们可以这样做:

df3 = df.groupby(pd.TimeGrouper(freq='M')).mean()
print(df3)

并得到:

enter image description here

下面是包装到函数中的过程的一部分:

# My function
def function1(df):
df = df.groupby(pd.TimeGrouper(freq='M')).sum()
return df

# Function1 call
df4 = function1(df = df)
print(df4)

这很好用:

enter image description here

当我尝试在 Function2 中添加 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())

enter image description here

我的第二次尝试引发了一个属性错误:

# Function2 test 2
df6 = function2(df = df, fun = 'sum()')

enter image description here

是否可以对此设置进行一些调整以使其正常工作? (我尝试了另一个版本,其中“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)

最佳答案

你需要使用apply

def function2(df, fun):
return df.groupby(pd.TimeGrouper(freq='M')).apply(fun)

只需确保fun 是一个接受pd.DataFrame

的可调用对象

但是,您可能应该使用 agg。如果 fun 将列减少为类似于 summean 的标量,那么这应该可行。需要考虑的事情。

df.groupby(pd.TimeGrouper('M')).agg(['sum', 'mean', fun])

关于python - Pandas:如何在函数内将 sum() 或 mean() 分配给 df.groupby?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45571284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com