0
votes

Remplacer 'na dans une liste imbriquée

J'essaie de procéder à ce qui suit: Identifiez s'il existe une valeur «na» dans une liste imbriquée, et si oui, pour la remplacer par la valeur moyenne de la somme des autres éléments de la liste. Les éléments des listes doivent être des flotteurs. Par exemple: xxx pré>

doit revenir p> xxx pré>

le code ci-dessous, bien long et redondant, fonctionne: p> xxx pré>

par exemple: p> xxx pré>

renvoie la sortie souhaitée: p>

data = [["1.2","NA","0.2"],["44.0","67.00","90.0"]]


10 commentaires

C'est Bonkers OMO que certaines personnes suggèrent que vous devez importer des packages informatiques tiers pour gérer un calcul simple comme celui-ci.


@Benquigley qui dépend toutefois du reste du programme de l'OP. S'ils effectuent une série d'opérations sur les données clairement tabulaires, elles doivent utiliser des outils plus appropriés.


Op, je pense que nous avons besoin d'un peu plus d'informations de votre part afin de répondre correctement à cette question. En plus de ce que j'ai mentionné ci-dessus concernant le reste de votre programme et vos données, par exemple, les sublistes contiennent toujours 3 éléments?


J'ai oublié d'ajouter: Que se passe-t-il si le subliste est composé entièrement de 'na' valeurs? Pendant que nous sommes sur le sujet, en utilisant la chaîne 'na' comme ceci est probablement une mauvaise idée.


@Amc il devrait retourner 0s. Le code que Bhosale Shikant a partagé des œuvres comme un charme. En ce qui concerne les éléments, il n'est pas nécessaire qu'ils soient toujours 3 dans la liste. Le mien a effectivement travaillé, mais pas pour plus d'une «na 'par liste.


@Seifer Où se trouve ces données? En ce qui concerne les éléments, il n'est pas nécessaire qu'ils soient toujours 3 dans la liste. Y a-t-il des règles ou des modèles, alors?


@Amc moi-même. J'essaie d'expérimenter différentes façons de résoudre les choses dans la base python. Pas de motifs. Juste que les valeurs «na» doivent être remplacées par la somme moyenne des autres éléments de la liste et que toutes les valeurs doivent ensuite être converties en flotteurs


@Seifer Juste pour confirmer, vous créez les données d'entrée? Vous voulez pratiquer des cordes à flotter pour flotter?


@Amc juste une partie du problème. Oui, surtout dans une liste imbriquée


Laissez-nous Continuez cette discussion en chat .


5 Réponses :


1
votes

Je suggérerais d'utiliser des fonctionnalités de Pandas, car ces types d'opérations sont exactement ce que les pandas ont été développés. On peut simplement réaliser ce que vous voulez en quelques lignes de code: xxx

qui renvoie la sortie recherchée: xxx

BTW Votre code fonctionne Pour moi, ça va bien dans ce cas simple: xxx

Cela commencera certainement à défailler ou de donner des résultats défectueux dans des cas plus compliqués, Fe Si vous avez plus de 1 "na" de la valeur dans la liste imbriquée, vous obtiendrez une exception ValueError (vous allez essayer de convertir la chaîne en flottant).


0 commentaires

0
votes

Une raison pour laquelle votre code a fini un peu surcpliqué est que vous avez essayé de commencer par résoudre le problème d'une "liste imbriquée". Mais vraiment, tout ce dont vous avez besoin est une fonction qui traite une liste de chaînes numériques avec des valeurs "na", puis vous pouvez simplement appliquer cette fonction à chaque élément de la liste.

def float_or_average(list_of_num_strings):
    # First, convert every item that you can to a number. You need to do this
    # before you can handle even ONE "NA" value, because the "NA" values need
    # to be replaced with the average of all the numbers in the collection.
    # So for now, convert ["1.2", "NA", "2.0"] to [1.2, "NA", 2.0]

    parsed = []

    # While we're at it, let's record the sum of the floats and their count,
    # so that we can compute that average.
    numeric_sum = 0.0
    numeric_count = 0

    for item in list_of_num_strings:
        if item == "NA":
            parsed.append(item)
        else:
            floating_point_value = float(item)
            parsed.append(floating_point_value)
            numeric_sum += floating_point_value
            numeric_count += 1
    # Now we can calculate the average:
    average = numeric_sum / numeric_count

    # And replace the "NA" values with them.
    for i, item in enumerate(parsed):
        if item == "NA":
            parsed[i] == average
    return parsed
    # Or, with a list comprehension (replacing the previous four lines of
    # code):
    return [number if number != "NA" else average for number in parsed]


# Using this function on a nested list is as easy as
example_data = [["1.2", "3.1", "0.2"], ["44.0", "NA", "90.0"]]
parsed_nested_list = []
for sublist in example_data:
    parsed_nested_list.append(float_or_average(sublist))
# Or, using a list comprehension (replacing the previous three lines of code):
parsed_nested_list = [float_or_average(sublist) for sublist in example_data]


0 commentaires

0
votes
def convert_data(data):

    for lst in data:

        sum = 0
        index_na = list()

        for elem in range(len(lst)):

            if lst[elem] != 'NA':
                sum += float(lst[elem])
                lst[elem] = float(lst[elem])
            else:
                index_na.append(elem)

        if len(index_na) > 0:
            len_values = sum / (len(lst)-len(index_na))

            for i in index_na:
                lst[i] = float("{0:.2f}".format(len_values))

    return data

0 commentaires

1
votes

Ceci devrait faire l'affaire, en utilisant numpy numpy : xxx

sortie: xxx


0 commentaires

1
votes
data_var = [["1.2", "3.1", "0.2"], ["44.0", "NA", "90.0"]]


def replace_na_with_mean(list_entry):
    for i in range(len(list_entry)):
        index_list = []
        m = 0
        while 'NA' in list_entry[i]:
            index_list.append(list_entry[i].index('NA') + m)
            del list_entry[i][list_entry[i].index('NA')]
        if list_entry[i]:
            for n in range(len(list_entry[i])):
                list_entry[i][n] = float(list_entry[i][n])
        if index_list:
            if list_entry[i]:
                avg = sum(list_entry[i]) / len(list_entry[i])
            else:
                avg = 0
            for l in index_list:
                list_entry[i].insert(l, avg)
    return list_entry


print(replace_na_with_mean(data_var))

0 commentaires