减少函数中的多个返回
Posted
技术标签:
【中文标题】减少函数中的多个返回【英文标题】:Multiple returns in a reduce function 【发布时间】:2022-01-02 20:40:38 【问题描述】:我想连接几个数据帧。
df_t = pd.DataFrame("a": [0, 1, 2], "b": [1,2,3], "c": [9,8,7])
df_t2 = pd.DataFrame("a": [0, 1, 2], "b": [np.nan,0,3], "d": [9,8,7])
...
在这样做之前,我必须调用另一个函数,该函数接受一个数据帧并返回一个数据帧和一个列表
例如:
def do(a):
a = sth(a)
return a, a.columns.tolist()
我想将 concat 函数应用于每个数据帧并扩展每个数据帧的返回列列表
reduce(lambda y, y2: pd.concat([y,y2]), map(lambda x: do(x), [df_t,df_t2,...]))
但是,当它尝试在第二次迭代中连接我的列表时出现错误。这甚至可以在减少中解决吗?是否有另一种内存友好的方法来解决这个问题?
目标是有一个连接和处理的数据框和所有列的列表。
【问题讨论】:
这样构造代码有什么特别的原因吗?它不容易阅读,也不完全是 Pythonic 我愿意接受任何建议 :) 我只是想避免使用循环和附加 预期输出是什么,请详细说明 一个大的(连接的)数据框从数据框列表(处理/分解的列...->由不同的函数)和每个单独的数据框包含的列列表构建 【参考方案1】:将列处理卸载到共享变量,该变量在高阶函数运行之前更新。
from threading import Lock
class Store:
data = []
lock = Lock()
def do(df):
df = sth(df)
lock = Store.lock
lock.acquire()
Store.data.append(df.columns.tolist())
lock.release()
return df
reduce(lambda y, y2: pd.concat([y,y2]), map(lambda x: do(x), [df_t,df_t2]))
a b c d
0 0 1.0 9.0 NaN
1 1 2.0 8.0 NaN
2 2 3.0 7.0 NaN
0 0 NaN NaN 9.0
1 1 0.0 NaN 8.0
2 2 3.0 NaN 7.0
print(Store.data)
>> [['a', 'b', 'c'], ['a', 'b', 'd']]
【讨论】:
这是你能想到的唯一可能的ATM吗?我也想到了这一点,但问题是该函数是可能从多个点(甚至可能是并行)调用的更大实现的一部分。这就是为什么我想避免更新“实例属性” 我们可以添加一个同步原语以允许一个参与者一次访问,我试图使答案尽可能接近原始方法 更新它以包含我提到的模式以上是关于减少函数中的多个返回的主要内容,如果未能解决你的问题,请参考以下文章