2017-09-28 3 views
0

J'ai utilisé pandas.read_csv pour lire un fichier Excel, il y a deux colonnes dans mon fichier, l'une est un type chaîne, l'autre est un entier.Comment puis-je ajouter deux types de données, string et int, dans numpy ndarray

data = pandas.read_csv('data.csv') 

Ensuite, j'ai imprimé ces types de données pour ces ndarrays numpy.

print(type(data.get_values()[0, 0])) 
print(type(data.get_values()[0, 1])) 

Résultat:

Il m'a montré qu'il ya un moyen d'ajouter deux types de données différentes dans un même ndarrays numpy.

Cependant, quand je veux essayer d'ajouter deux types de données différentes de données dans un même ndarrays numpy:

arr = numpy.ndarray((1, 2)) 
arr[0][0] = 1 
arr[0][1] = 'str' 

La console m'a montré ces informations:

ValueError: could not convert string to float: 'str' 

Est-ce que quelqu'un peut me dire comment faire comme les pandas de classe a fait?

+0

La fonction 'get_value()' doit prendre deux arguments dans 'pandas'. –

+0

Merci, @GergesDib. Je viens de le changer – CDY

+0

Qu'est-ce que 'data.dtypes'? – hpaulj

Répondre

2

Vous pouvez créer num ndarray s avec des types de données de type C arbitraires pour chacun des champs. L'astuce consiste à create the datatype for the array d'abord, puis définissez cela comme dtype pour le tableau. La seule chose gênante à propos de ceci est, puisque ce sont des types de style C, les types doivent être définis explicitement et cela inclut, si vous avez des chaînes, de définir le nombre de caractères que chaque champ peut contenir.

Par exemple:

>>> import numpy as np 
>>> person_dt = np.dtype([('Name', 'S25'), ('Age', np.uint8)]) 
>>> person_dt 
dtype([('Name', 'S25'), ('Age', 'u1')]) 
>>> persons = np.array([('alice', 35), ('bob', 39)], dtype=person_dt) 
>>> persons 
array([(b'alice', 35), (b'bob', 39)], 
     dtype=[('Name', 'S25'), ('Age', 'u1')]) 

Ici, je suis la création d'un numpy dtype. Chaque partie distincte d'un tableau est un field, et j'affecte Name et Age aux noms de ces champs, et d'assigner le type pour chaque champ. Donc, le champ Name est une chaîne de 25 caractères ou moins (qui est une chaîne terminée \0 comme vous auriez en C), et l'âge est un entier non signé puisque nos âges seront bien sûr inférieurs à 255. Notez le b avant le chaîne représente juste que le type est un byte-string

Ensuite, je crée simplement le tableau avec le nouveau dtype et transmettre les valeurs.

Ce qui est cool à ce sujet est que vous pouvez saisir les valeurs par champ auquel ils appartiennent.Par exemple, vous pouvez saisir tous les âges en saisissant le champ Age, et il aura le type I affecté les âges à:

>>> persons['Age'] 
array([35, 39], dtype=uint8) 

vous pouvez donc aller plus loin et index dans ces tableaux résultant:

>>> persons['Name'][1] 
b'bob' 

et vous pouvez toujours créer et assigner comme vous le feriez normalement:

>>> new_persons = np.zeros(5, dtype=person_dt) 
>>> new_persons 
array([(b'', 0), (b'', 0), (b'', 0), (b'', 0), (b'', 0)], 
     dtype=[('Name', 'S25'), ('Age', 'u1')]) 
>>> new_persons[0] = ('alice', 25) 
>>> new_persons[1] = ('bob', 26) 
>>> new_persons['Name'][2:5] 
array([b'', b'', b''], 
     dtype='|S25') 
>>> new_persons['Name'][2:5] = 'carol', 'david', 'eve' 
>>> new_persons['Age'][2:5] = 27, 28, 29 
>>> new_persons 
array([(b'alice', 25), (b'bob', 26), (b'carol', 27), (b'david', 28), (b'eve', 29)], 
     dtype=[('Name', 'S25'), ('Age', 'u1')]) 

J'assisté à une conférence un peu de temps il y a tout sur la création et la gestion numpy dtypes et c'était génial; le cahier de Jupyter pour la conversation est en ligne et vous pouvez access it here, qui pourrait jeter un peu plus de lumière sur toutes les différentes façons dont vous pouvez les utiliser.