Представьте, что у нас есть различные структуры фреймов данных в 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 фреймов данных. Теперь я хочу создать логи c, которые сопоставляют имена столбцов с указанными c функциями для создания нового столбца «metri c» (представьте, что это область для двух столбцов и том для 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
Теперь функция области создаст новый столбец для фрейма данных df1['metric'] = df1['height'] * df2['widht']
, а функция объем создаст новый столбец для фрейма данных 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 в качестве параметров и возвращает фрейм данных с соответствующим 'metri c', добавленным к нему.
Я знаю, что это может быть достигнуто несколькими операторами if и else, но это не кажется самым разумным решением. Возможно, существует шаблон проектирования, который может решить эту проблему, но я не эксперт в шаблонах проектирования.
Спасибо, что прочитали мой вопрос! Я с нетерпением жду ваших замечательных ответов.