所以我有这个示例数据框:
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_max_range()和min_range()列x_mean, y_mean获得新列。
min_max_range()
min_range()
x_mean, y_mean
就像函数min_max_val使用列x_mean和范围x_range作为创建列的输入一样x_min_max_val,类似地,列y_mean和范围y_range也用于列y_min_max_val:
min_max_val
x_mean
x_range
x_min_max_val
y_mean
y_range
y_min_max_val
我可以使用这一种衬管一个接一个地创建每个列,但是我想x_mean & y_mean一次用一个衬管将其应用于两个列。
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
另外,您需要在列表中具有进行计算所需的列(或者,如果它们具有特定的模式,则可以使用正则表达式来获取它们)
mean_cols_list = ['x_mean', 'y_mean']
现在,要将函数应用于所有列,您需要定义一个这样的函数
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)