减少函数中的多个返回

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吗?我也想到了这一点,但问题是该函数是可能从多个点(甚至可能是并行)调用的更大实现的一部分。这就是为什么我想避免更新“实例属性” 我们可以添加一个同步原语以允许一个参与者一次访问,我试图使答案尽可能接近原始方法 更新它以包含我提到的模式

以上是关于减少函数中的多个返回的主要内容,如果未能解决你的问题,请参考以下文章

自定义函数

MySQL函数

MySql 函数

减少查询中的结果数

如何从 SQL 中的用户定义函数返回多个值

scala闭包/匿名函数中的多个返回点