gpt4 book ai didi

python - Pandas 灵活确定指标

转载 作者:行者123 更新时间:2023-12-02 10:42:44 25 4
gpt4 key购买 nike

想象一下 Pandas 中有不同的数据帧结构

# creating the first dataframe 
df1 = pd.DataFrame({
"width": [1, 5],
"height": [5, 8]})

# creating second dataframe
df2 = pd.DataFrame({
"a": [7, 8],
"b": [11, 23],
"c": [1, 3]})

# creating second dataframe
df3 = pd.DataFrame({
"radius": [7, 8],
"height": [11, 23]})

一般来说,可能有超过 2 个数据帧。现在,我想创建一个逻辑,将列名称映射到特定函数以创建新的列“指标”(将其视为两列的面积和 3 列的体积)。我想指定列名称集合

column_name_ensembles = {
"1": {
"ensemble": ['height', 'width'],
"method": area},
"2": {
"ensemble": ['a', 'b', 'c'],
"method": volume_cube},
"3": {
"ensemble": ['radius', 'height'],
"method": volume_cylinder}}

def area(width, height):
return width * height

def volume_cube(a, b, c):
return a * b * c

def volume_cylinder(radius, height):
return (3.14159 * radius ** 2) * height

现在,area 函数为数据框 df1['metric'] = df1['height'] * df2['widht'] 创建一个新列,volumen 函数将创建一个新列数据框 df2['metic'] = df2['a'] * df2['b'] * df2['c'] 的列。请注意,函数可以具有任意形式,但它以集合作为参数。所需的函数 metric(df, column_name_ensembles) 应采用任意数据帧作为输入,并通过检查列名称来决定应应用哪个函数。

输入输出行为示例

df1_with_metric = metric(df1, column_name_ensembles)
print(df1_with_metric)
# output
# width height metric
# 0 1 5 5
# 1 5 8 40
df2_with_metric = metric(df2, column_name_ensembles)
print(df2_with_metric)
# output
# a b c metric
# 0 7 11 1 77
# 1 8 23 3 552
df3_with_metric = metric(df3, column_name_ensembles)
print(df3_with_metric)
# output
# radius height metric
# 0 7 11 1693.31701
# 1 8 23 4624.42048

完美的解决方案是一个函数,它将数据帧和column_name_ensembles作为参数,并返回添加了适当“指标”的数据帧。

我知道这可以通过多个 if 和 else 语句来实现,但这似乎不是最智能的解决方案。也许有一种设计模式可以解决这个问题,但我不是设计模式方面的专家。

感谢您阅读我的问题!我期待您的精彩答复。

最佳答案

您可以使用inspect模块自动提取参数名称,然后将参数名称的 frozenset 直接映射到度量函数:

import inspect

metrics = {
frozenset(inspect.signature(f).parameters): f
for f in (area, volume_cube, volume_cylinder)
}

然后,对于给定的数据框,如果保证所有列都是相关指标的参数,您可以简单地查询该字典:

def apply_metric(df, metrics):
metric = metrics[frozenset(df.columns)]
args = tuple(df[p] for p in inspect.signature(metric).parameters)
df['metric'] = metric(*args)
return df

如果输入数据框的列数多于指标函数所需的列数,您可以使用集合交集来查找相关指标:

def apply_metric(df, metrics):
for parameters, metric in metrics.items():
if parameters & set(df.columns) == parameters:
args = tuple(df[p] for p in inspect.signature(metric).parameters)
df['metric'] = metric(*args)
break
else:
raise ValueError(f'No metric found for columns {df.columns}')
return df

关于python - Pandas 灵活确定指标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60576785/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com