gpt4 book ai didi

python - 定义一个函数使用其他函数名作为参数

转载 作者:太空狗 更新时间:2023-10-29 21:41:23 26 4
gpt4 key购买 nike

我有一个如下所示的 DataFrame:

df = {'col_1': [1,2,3,4,5,6,7,8,9,10],
'col_2': [1,2,3,4,5,6,7,8,9,10],
'col_3':['A','A','A','A','A','B','B','B','B','B']}
df = pd.DataFrame(df)

虽然我使用的真实数据有数百列,但我想使用不同的函数(如 min)来操作这些列, max以及自定义函数,如:

def dist(x):
return max(x) - min(x)
def HHI(x):
ss = sum([s**2 for s in x])
return ss

我不想写很多行,而是想要一个像这样的函数:

def myfunc(cols,fun):
return df.groupby('col_3')[[cols]].transform(lambda x: fun)
# which allow me to do something like:

df[['min_' + s for s in cols]] = myfunc(cols, min)
df[['max_' + s for s in cols]] = myfunc(cols, max)
df[['dist_' + s for s in cols]] = myfunc(cols, dist)

这在 Python 中是否可行(我猜是"is")?
那如果是怎么办?

EDIT ====== ABOUT NAME OF SELF-DEFINED FUNCTION =======
根据jpp的解决方案,我问的是可能的,至少对于内置函数,更多的工作需要考虑自定义函数。

可行的解决方案,

temp = df.copy()
for func in ['HHI','DIST'] :
print(func)
temp[[ func + s for s in cols]] = df.pipe(myfunc,cols,eval(func))

这里的关键是使用eval tunction 将字符串表达式转换为函数。然而,可能有更好的方法来做到这一点,期待看到。

EDIT ====== per jpp's comment about name of self-defined function =======

jpp 的评论将函数名称直接提供给 myfun根据我的测试是有效的,但是,新的列名称基于 func会是这样的:<function HHI at 0x00000194460019D8> ,可读性不是很好,修改为temp[[ str(func.__name__) + s for s in cols]] ,希望这对以后遇到这个问题的人有所帮助。

最佳答案

这是使用 pd.DataFrame.pipe 的一种方法.

在 Python 中,一切 都是一个对象,可以在不进行类型检查的情况下传递。理念是“不要检查它是否有效,只需尝试...”。因此,您可以将字符串或函数传递给 myfunc,然后再传递给 transform。没有任何有害的副作用。

def myfunc(df, cols, fun):
return df.groupby('col_3')[cols].transform(fun)

cols = ['col_1', 'col_2']

df[[f'min_{s}' for s in cols]] = df.pipe(myfunc, cols, 'min')
df[[f'max_{s}' for s in cols]] = df.pipe(myfunc, cols, 'max')
df[[f'dist_{s}' s in cols]] = df.pipe(myfunc, cols, lambda x: x.max() - x.min())

结果:

print(df)

col_1 col_2 col_3 min_col_1 min_col_2 max_col_1 max_col_2 dist_col_1 \
0 1 1 A 1 1 5 5 4
1 2 2 A 1 1 5 5 4
2 3 3 A 1 1 5 5 4
3 4 4 A 1 1 5 5 4
4 5 5 A 1 1 5 5 4
5 6 6 B 6 6 10 10 4
6 7 7 B 6 6 10 10 4
7 8 8 B 6 6 10 10 4
8 9 9 B 6 6 10 10 4
9 10 10 B 6 6 10 10 4

dist_col_2
0 4
1 4
2 4
3 4
4 4
5 4
6 4
7 4
8 4
9 4

关于python - 定义一个函数使用其他函数名作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52682614/

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