Python 如何使用具有不同输入参数的相同函数在dataframe中创建新列?

Python 如何使用具有不同输入参数的相同函数在dataframe中创建新列?,python,pandas,function,dataframe,Python,Pandas,Function,Dataframe,我有一个示例数据帧: x_mean x_min x_max y_mean y_min y_max 1 85.6 3 264 75.7 3 240 2 105.5 6 243 76.4 3 191 3 95.8 19 287 48.4 8

我有一个示例数据帧:

      x_mean    x_min    x_max     y_mean     y_min     y_max
 1      85.6        3      264       75.7         3       240
 2     105.5        6      243       76.4         3       191
 3      95.8       19      287       48.4         8       134
 4      85.5       50      166       64.8        32       103
 5      55.9       24      117       46.7        19        77 


x_range = [list(range(0,50)),list(range(51,100)),list(range(101,250)),list(range(251,350)),list(range(351,430)),list(range(431,1000))]
y_range = [list(range(0,30)),list(range(31,60)),list(range(61,90)),list(range(91,120)),list(range(121,250)),list(range(251,2000))]


#here x = Any column with mean value (eg. x_mean or y_mean)
# y = x_range / y_range 

def min_max_range(x,y):
for a in y:
    if int(x) in a:
        min_val = min(a)
        max_val = max(a)+1
        return max_val - min_val

def min_range(x,y):
for a in y:
    if int(x) in a:
        min_val = min(a)
        return min_val
现在,我想将这些函数
min\u max\u range()
min\u range()
应用于列
x\u-mean,y\u-mean
,以获得新列

与函数
min\u max\u val
使用列
x\u mean
和范围
x\u range
作为创建列
x\u min\u max\u val
的输入一样,类似地,列
y\u mean
,范围
y\u range
用于列
y\u max\u val

通过使用这些一行程序,我可以一列一列地创建每一列,但我想用一行程序一次性将其应用于两列
x_-mean&y_-mean

df['x_min_max_val'] = df['x_mean'].apply(lambda x: min_max_range(x,x_range))
df['y_min_max_val'] = df['y_mean'].apply(lambda x: min_max_range(x,y_range))  
生成的数据帧应如下所示:

      x_mean    x_min    x_max     y_mean     y_min     y_max    x_min_max_val   y_min_max_val        x_min_val   y_min_val
1      85.6        3      264       75.7         3       240                49              29               51          61
2     105.5        6      243       76.4         3       191               149              29              101          91
3      95.8       19      287       48.4         8       134                49              29               51          91
4      85.5       50      166       64.8        32       103                49              29               51          61
5      55.9       24      117       46.7        19        77                49              29               51          31
我想一次性创建这些列,而不是一次性创建一列。我该怎么做?有什么建议吗?或者像这样的东西能起作用

df.filter(regex='mean').apply(lambda x: min_max_range(x,x+'_range'))

这是实现这一目标需要遵循的概念。首先,您需要将范围存储在字典中,以便通过名称访问它们

range_dict = {}
range_dict['x_range'] = x_range
range_dict['y_range'] = y_range
此外,还需要在列表中包含需要进行计算的列(或者,如果这些列具有特定模式,则可以使用正则表达式获取这些列)

现在,要在所有列上应用函数,需要定义如下函数

def min_max_calculator(df, range_dictionary, mean_columns_list):
    for i in range(len(mean_cols_list)):
        # this returns 'x_mean'
        current_column = mean_cols_list[i]
        # this returns 'x_min_max_value'
        output_col_name = current_column.replace('mean','min_max_value')
        # this returns 'x_range'
        range_name = current_column.replace('mean','range')
        # this returns the list of ranges for x_range
        range_list = range_dict[range_name]
        # This add the calculated column to the dataframe
        df[output_col_name] = df[current_column].apply(lambda x: min_max_range(x,range_list))
    return(df)

df_output = min_max_calculator(df, range_dict, mean_cols_list)

这些是您正在使用的函数,还是仅仅是示例?我正在使用它们@Datanovice@astroluv很难理解你在追求什么。因此,您希望函数min_max_range获取输入x_mean和x_range并输出指定的列?当前,
min_max_range
将返回None,因为
y_mean
中没有值在
x_mean
中?此外,传入列也会导致错误。另外,您目前如何做到这一点,以及您希望如何“一次性”完成?我如何添加另一列以使用其他列获取新列。x_new=df.x_min_max_val/(df.x_max-df.x_min)*(df.x_mean-df.x_min)+df.x_min_max_val
def min_max_calculator(df, range_dictionary, mean_columns_list):
    for i in range(len(mean_cols_list)):
        # this returns 'x_mean'
        current_column = mean_cols_list[i]
        # this returns 'x_min_max_value'
        output_col_name = current_column.replace('mean','min_max_value')
        # this returns 'x_range'
        range_name = current_column.replace('mean','range')
        # this returns the list of ranges for x_range
        range_list = range_dict[range_name]
        # This add the calculated column to the dataframe
        df[output_col_name] = df[current_column].apply(lambda x: min_max_range(x,range_list))
    return(df)

df_output = min_max_calculator(df, range_dict, mean_cols_list)