Imaginons que nous ayons différentes structures de cadres de données dans 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]})
En général, il peut y avoir plus de deux cadres de données. Maintenant, je veux créer une logique qui fait correspondre les noms de colonnes à des fonctions spécifiques pour créer une nouvelle colonne "métrique" (pensez-y comme la surface pour deux colonnes et le volume pour 3 colonnes). Je veux spécifier des ensembles de noms de colonnes
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
Maintenant, la fonction zone crée une nouvelle colonne pour le cadre de données. df1['metric'] = df1['height'] * df2['widht']
et la fonction volumen va créer une nouvelle colonne pour le dataframe df2['metic'] = df2['a'] * df2['b'] * df2['c']
. Notez que les fonctions peuvent avoir une forme arbitraire mais elles prennent l'ensemble comme paramètres. La fonction désirée metric(df, column_name_ensembles)
doit prendre un cadre de données arbitraire en entrée et décider en inspectant les noms de colonnes quelle fonction doit être appliquée.
Exemple de comportement d'entrée-sortie
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
La solution idéale serait une fonction qui prendrait le cadre de données et les noms de colonnes comme paramètres et renverrait le cadre de données avec la "métrique" appropriée ajoutée.
Je sais que cela peut être réalisé par de multiples instructions if et else, mais cela ne semble pas être la solution la plus intelligente. Il existe peut-être un modèle de conception qui peut résoudre ce problème, mais je ne suis pas un expert en modèles de conception.
Merci d'avoir lu ma question ! J'attends avec impatience vos excellentes réponses.