2017-08-18 1 views
3

J'ai les données CSV suivantes:Impossible de calculer la somme des données de la colonne Basé monnaie dans Pandas

+----------+-------------+-------+---------+ 
| Category | Part Number | Units | Cost | 
+----------+-------------+-------+---------+ 
| Axel  |   78 | 587 | $159.95 | 
| Rim  |   48 | 234 | $38.75 | 
| Nut  |   39 | 1234 | $0.15 | 
| Axel  |   79 | 67 | $110.95 | 
+----------+-------------+-------+---------+ 

Et le code suivant:

# Importing the libraries 
import numpy as np 
import matplotlib.pyplot as plt 
import pandas as pd 

# Importing the dataset 
df = pd.read_csv('stock.csv',engine="python") 

#Sum of values by category 
df.groupby('Category').sum()['Units'] 
df.groupby('Category').sum()['Cost'] 

Quand je lance la deuxième à la dernière ligne, je obtenir le résultat suivant:

df.groupby('Category').sum()['Units'] 
Out[4]: 
Category 
Axel  654 
Nut  1234 
Rim  234 
Name: Units, dtype: int64 

Quand je lance la dernière ligne, je reçois l'erreur suivante:

KeyError: 'Cost' 

Je ne suis pas sûr s'il existe un moyen simple d'additionner les données sans convertir le type de données en nombre entier, puis en le convertissant de nouveau.

+2

'Cost' ressemble à une chaîne pour moi. Dans quel cas ... non. Vous ne pouvez pas ajouter de chaînes en tant que nombres sans les convertir. Si ce sont des chaînes * not *, vous pouvez faire 'sum (numeric_only = False)' –

Répondre

1

.sum() ignore toutes les colonnes non numériques. Vous devez d'abord convertir le coût en chiffres:

df["Cost"] = df["Cost"].str[1:].astype(float) 
+2

Je suggérerais 'Decimal' pour ajouter de l'argent. –

+1

@CoryMadden '.sum()' convertit 'Decimal' en' float64', de toute façon. – DyZ

+0

Même avec 'numeric_only = False'? Désolé d'être paresseux, mais pouvez-vous le prouver? :) Cela semble être une caractéristique très indésirable. Je ne suis pas sûr que je suis convaincu, voir mon fil [ici] (https://stackoverflow.com/questions/45472366/how-can-i-sum-two-different-columns-at-once-where-one -contains-decimal-objects-i). Le calcul était très rapide quand je les ai convertis en flotteurs, mais avec 'Decimal' c'était très lent. –