2
votes

Comment obtenir la moyenne d'une fourchette?

J'ai un ensemble de données tel que ci-dessous:

AttributeError: 'Series' object has no attribute 'split'

Je dois obtenir la moyenne de chaque cellule et la remplacer par la plage (en flottant)?

Donc , le résultat est

begin = dt["size"].str.replace("mm", "").split("-")[0]

Ce que j'ai fait est:

[2,5,10,13.5,17.5]

il se plaint d'une erreur,

data = { "size":["2","5mm","10mm","12-15mm","16-19mm"] }
dt =pd.DataFrame(data=data)

De plus, je ne suis pas sûr que ce soit la meilleure pratique.

Quelle est la meilleure approche pour obtenir la moyenne de ces plages de chaînes?


0 commentaires

6 Réponses :


3
votes

Utilisation de str.findall avec .apply

      size  size_m
0        2     2.0
1      5mm     5.0
2     10mm    10.0
3  12-15mm    13.5
4  16-19mm    17.5

Sortie:

data = { "size":["2","5mm","10mm","12-15mm","16-19mm"] }
dt =pd.DataFrame(data=data)

dt["size_m"] = dt["size"].str.findall("(\d+)").apply(lambda x: sum(map(float, x))/len(x))
print(dt)


1 commentaires

Bien que cela fonctionne bien pour l'exemple fourni dans la question, lorsque je l'exécute dans mon vrai code, il se plaint de: dt ['Size']. Str.findall ("(\ d +)"). Apply (lambda x: sum (map (float, x)) / len (x)) TypeError: l'objet 'float' n'est pas itérable Une idée?



5
votes

Utiliser :

0     2.0
1     5.0
2    10.0
3    13.5
4    17.5
dtype: float64

Ou utiliser:

print(dt['size'].str.rstrip('mm').apply(lambda x: sum(map(int, x.split('-'))) / len(x.split('-'))).astype(float))

Sortie:

print(dt['size'].str.rstrip('mm').str.split('-', expand=True).astype(float).mean(1))

p>


1 commentaires

quand je l'exécute dans mon vrai code, il se plaint de dt ['Size']. str.rstrip ('mm'). apply (lambda x: sum (map (int, x.split ('-') )) / len (x.split ('-'))). astype (float) AttributeError: l'objet 'float' n'a pas d'attribut 'split' Avez-vous une idée?



0
votes

Je ne suis pas vraiment sûr ici, car je n'utilise pas python au quotidien. Mais je suppose que le problème est peut-être le retour du str.replace ("mm", "") - qui semble renvoyer JSON au lieu d'un Array .


0 commentaires

0
votes

Une autre option, non-pandas, consiste à utiliser mean () du module statistics .

import statistics

data = {"size": ["2", "5mm", "10mm", "12-15mm", "16-19mm"]}

size_ranges = (size.replace("mm", "").split("-") for size in data["size"])
averages = [statistics.mean([int(s) for s in size_range]) for size_range in size_ranges]
print(averages)
# [2, 5, 10, 13.5, 17.5]


0 commentaires

0
votes

importer des pandas en tant que PD
data = {"size": ["2", "5mm", "10mm", "12-15mm", "16-19mm"]}
dt = pd.DataFrame (données = données)
print (dt ['size']. str.rstrip ('mm'). apply (lambda x: sum (map (int, x.split ('-'))) / len (x.split ('-') )). astype (float) .tolist ())


0 commentaires

0
votes

Je ne suis pas spécialiste, mais je vais le faire de cette façon:

import numpy as np

data = { "size":["2","5mm","10mm","12-15mm","16-19mm"] }

def rangeToAvr(strData):
    """transform 'strData' to float"""
    strData = strData.replace('m', '-')
    strData = strData.split('-')
    strData = list(filter(None, strData))

    strData = [float(d) for d in strData]
    res = np.mean(strData)

    return res


def transform_data(data):
    """transfrom data to wanted form"""
    sizeData = data['size']

    data['size'] = list(map(rangeToAvr, sizeData))

    return data


if __name__ == '__main__':
    data = transform_data(data)

    print(data)


>>>{'size': [2.0, 5.0, 10.0, 13.5, 17.5]}


0 commentaires