使用提供的双变量函数链式连接可变大小列表中的多个参数
chain join multiple arguments from a list of variable size using a supplied bivariate function
我希望对列表中的所有参数执行一个函数(map
可以完成该部分),然后 "join" 使用另一个可以提前退出的函数(比如 [= =29=] 是找到实例或达到阈值)。
这是一个示例,其中函数是 ~np.isnan
来自数据帧的可变列数, "join" 是对结果布尔掩码的按位 &
运算符。因此它会查找数据框中是否存在任何 NaN 值,其中位置对应于列的可变列表。然后我删除了为提供的列名称找到 NaN 的行。
import pandas as pd
import numpy as np
import random
data_values = range(10)
column_names = list(map(lambda x: "C" + str(x), data_values))
data = pd.DataFrame(columns=column_names, data=np.reshape(np.repeat(data_values,10,0),(10,10)))
data.iloc[random.sample(data_values,random.sample(data_values,1)[0]),random.sample(data_values,random.sample(data_values,1)[0])] = np.nan
cols_to_check = random.sample(column_names,random.sample(data_values,1)[0])
# ideally: data.loc[pd.notnull(data[cols_to_check[0]]) & pd.notnull(data[cols_to_check[1]]) & ...]
# or perhaps: data.loc[chainFunc(pd.notnull, np.logical_and, cols_to_check)]
masks = [list(np.where(~np.isnan(data[x]))[0]) for x in cols_to_check]
data.iloc[list(set(masks[0]).intersection(*masks))]
这在大数据帧上变得非常慢,但是否可以使用 itertools
和 functools
来概括它并显着提高性能?像这样说 (伪代码):
def chainFunc(func_applied, func_chain, args):
x = func_applied(args[0])
for arg_counter in range(len(args)-1):
x = func_chain(x,func_applied(args[arg_counter+1]))
return(x)
它如何处理上面的数据框示例?
我一直在寻找一种通用方法来组合任意参数列表并将结果应用于数据框。我想在上面的例子中应用程序接近 dropNA
但不完全是。我一直在寻找 reduce
和 chain
的组合,没有真正的 pandas
特定接口,但它可能会起作用:
import functools
data.iloc[ np.where(functools.reduce(lambda x, y: x & y,
map(lambda z: pd.notnull(data[z]),
cols_to_check)))[0] ]
我希望对列表中的所有参数执行一个函数(map
可以完成该部分),然后 "join" 使用另一个可以提前退出的函数(比如 [= =29=] 是找到实例或达到阈值)。
这是一个示例,其中函数是 ~np.isnan
来自数据帧的可变列数, "join" 是对结果布尔掩码的按位 &
运算符。因此它会查找数据框中是否存在任何 NaN 值,其中位置对应于列的可变列表。然后我删除了为提供的列名称找到 NaN 的行。
import pandas as pd
import numpy as np
import random
data_values = range(10)
column_names = list(map(lambda x: "C" + str(x), data_values))
data = pd.DataFrame(columns=column_names, data=np.reshape(np.repeat(data_values,10,0),(10,10)))
data.iloc[random.sample(data_values,random.sample(data_values,1)[0]),random.sample(data_values,random.sample(data_values,1)[0])] = np.nan
cols_to_check = random.sample(column_names,random.sample(data_values,1)[0])
# ideally: data.loc[pd.notnull(data[cols_to_check[0]]) & pd.notnull(data[cols_to_check[1]]) & ...]
# or perhaps: data.loc[chainFunc(pd.notnull, np.logical_and, cols_to_check)]
masks = [list(np.where(~np.isnan(data[x]))[0]) for x in cols_to_check]
data.iloc[list(set(masks[0]).intersection(*masks))]
这在大数据帧上变得非常慢,但是否可以使用 itertools
和 functools
来概括它并显着提高性能?像这样说 (伪代码):
def chainFunc(func_applied, func_chain, args):
x = func_applied(args[0])
for arg_counter in range(len(args)-1):
x = func_chain(x,func_applied(args[arg_counter+1]))
return(x)
它如何处理上面的数据框示例?
我一直在寻找一种通用方法来组合任意参数列表并将结果应用于数据框。我想在上面的例子中应用程序接近 dropNA
但不完全是。我一直在寻找 reduce
和 chain
的组合,没有真正的 pandas
特定接口,但它可能会起作用:
import functools
data.iloc[ np.where(functools.reduce(lambda x, y: x & y,
map(lambda z: pd.notnull(data[z]),
cols_to_check)))[0] ]