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?
6 Réponses :
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)
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?
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>
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?
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 code>.
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]
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 ())
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]}