当前位置: 首页 > 面试题库 >

如何在不同的输入参数中应用相同的函数在pandas数据框中创建新列?

乐正意智
2023-03-14
问题内容

所以我有这个示例数据框:

      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_val使用列x_mean和范围x_range作为创建列的输入一样x_min_max_val,类似地,列y_mean和范围y_range也用于列y_min_max_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

另外,您需要在列表中具有进行计算所需的列(或者,如果它们具有特定的模式,则可以使用正则表达式来获取它们)

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)


 类似资料:
  • 我必须为要使用构造函数注入的不同属性值创建多个相同类型的bean。 目前我已经使用Bean范围作为原型 现在它正在按照上面的代码创建2个bean。期望:如何组合getClient

  • 我有一个数据框,如: 我需要为每个列应用一些函数,并在这个数据帧中创建具有特殊名称的新列。 所以我需要根据列和(如name)乘以两个额外的列,名称为和由两个。是否可以使用或其他结构来完成此操作?

  • 我想移除一个DIV元素的类,该元素是在调用函数时立即创建的。 问题是,我希望也是该函数的一部分。 这就是我现在拥有的功能。 我已尝试在函数中添加函数 但不管用。 也许我可以在调用函数的任何地方添加,但我想知道是否有一种方法可以在函数中实现这一点 函数是这样调用的。

  • 问题内容: 我有一个具有多年温度记录的温度文件,格式如下: 每年的记录数量和时间不同,因此熊猫的datetimeindices都不同。 我想在同一图中绘制不同年份的数据以进行比较。X轴为1月至12月,Y轴为温度。我应该怎么做呢? 问题答案: 尽管Chang的答案说明了如何在同一图形上多次绘制,但是在这种情况下,使用a和ing可能会更好: (假设您已经在数据框中使用了日期时间索引) 现在很容易绘制(

  • 我有一个实用函数,它接受参数大小写并相应地返回值 我有一个使用上述函数的主函数 现在,我正在使用unittest对get\u data()模块进行单元测试。嘲弄我无法将值传递给id和类型。 我尝试使用side_effect函数和面向问题根据输入参数的不同值模拟get_sport_associated_value()。 问题2:使用mock或mock的最佳方法是什么。这个场景中的magicmock?

  • 问题内容: 我需要从大约6000万行的数据集中创建一个2000列,大约30-50百万行的数据透视表。我曾尝试过旋转100,000行的数据块,但这种方法行得通,但是当我尝试通过先执行.append()然后再执行.groupby(’someKey’)。sum()来重组DataFrame时,我的所有内存都被占用了和python最终崩溃。 如何在有限的RAM量下处理如此大的数据? 编辑:添加示例代码 下面