Créer Vide Dataframe dans les Pandas en spécifiant les types de colonne
Je suis en train de créer un vide de la trame de données avec un index et spécifier les types de colonne. La façon dont je l'ai fait est le suivant:
df = pd.DataFrame(index=['pbp'],columns=['contract',
'state_and_county_code',
'state',
'county',
'starting_membership',
'starting_raw_raf',
'enrollment_trend',
'projected_membership',
'projected_raf'],
dtype=['str', 'str', 'str', 'str', 'int', 'float', 'float', 'int', 'float'])
Cependant, j'obtiens l'erreur suivante,
TypeError: data type not understood
Qu'est-ce que cela signifie?
Je ne pense pas que vous pouvez spécifier la dtypes de cette manière, vous pouvez passer d'un type unique comme
c'est vrai, selon le docs, je me demande bien pourquoi est-il que le constructeur ne permet pas que... ne serait-il pas plus efficace de créer un vide dataframe avec les types à partir du début des fins de répartition?
str
mais pas une liste de chaînes de caractères. Le dtype sera déduit lorsque vous affectez les valeurs de la colonne. Je pense qu'il devrait être inutile de préciser à tousc'est vrai, selon le docs, je me demande bien pourquoi est-il que le constructeur ne permet pas que... ne serait-il pas plus efficace de créer un vide dataframe avec les types à partir du début des fins de répartition?
OriginalL'auteur Vincent | 2016-04-06
Vous devez vous connecter pour publier un commentaire.
Ce vraiment sent comme un bug.
Voici un autre (plus simple) solution.
OriginalL'auteur user48956
Juste une remarque.
Vous pouvez obtenir autour de l'Erreur de Type à l'aide de
np.dtype
:mais vous avez de la place:
si vous souhaitez copier le dtypes d'un bloc existant, vous pouvez sélectionner 0 lignes à partir de cette image et votre vide DF avec la même dtypes. Par exemple
cpy = df.loc[[False]*len(df)]
devrait faire l'affaireOriginalL'auteur ptrj
J'ai trouvé cette question après l'exécution de la même édition. Je préfère la solution suivante (Python 3) pour la création d'un vide DataFrame avec aucun indice.
De tester ce ...
:
Et les types de données ...
:
L'ajout d'un index qui est difficile car il n'existe pas une véritable valeur manquante pour la plupart des types de données de sorte qu'ils finissent par obtenir jeté d'un autre type avec un natif de la valeur manquante (par exemple,
int
s sont exprimés àfloat
s ouobject
s), mais si vous avez des données complètes des types que vous avez spécifié, alors vous pouvez toujours insérer des lignes au besoin, et vos types seront respectés. Ceci peut être accompli avec:Encore une fois, comme @Hun souligné, ce n'est PAS la façon dont les Pandas est destiné à être utilisé.
OriginalL'auteur JaminSore
pandas n'offre pas de pure colonne de type integer. Vous pouvez soit utiliser float colonne et de convertir cette colonne de type entier ou de la traiter comme un objet. Ce que vous essayez de mettre en œuvre n'est pas la façon dont les pandas est censé être utilisé. Mais si VRAIMENT vous voulez VRAIMENT, vous pouvez obtenir autour de la TypeError message en faisant cela.
Vous pouvez réorganiser le col de l'ordre que vous le souhaitez. Mais encore une fois, ce n'est pas la façon pandas a été censé être utilisé.
Noter que l'int est traitée comme un objet.
Il ne semble pas être un problème avec le passage
dtype=int
l'absence de données, cependant.Cette absolument ressemble à un bug est toujours le comportement dans la dernière version. Avez-vous l'envoyer?
Son comportement attendu, cotées sur les mises en garde. Son car il n'y a pas de
nan
pourint
. Vous pouvez en lire plus à ce sujet sur le docsCela n'explique pas pourquoi aucun int colonnes peut être spécifié dans le constructeur. Si vous demandez une colonne int et, plus tard, insérer un nan, la bonne attitude serait de promouvoir la colonne à flotteur, ou lever une exception
OriginalL'auteur Hun
Vous pouvez le faire en passant un dictionnaire dans le DataFrame constructeur:
Ce sera correctement vous donner un dataframe qui ressemble à:
Avec dtypes:
Cela dit, il y a deux choses à noter:
1)
str
n'est pas réellement un type qu'un DataFrame colonne peut traiter; au lieu de cela, il tombe en arrière pour le cas général,object
. Ça va encore fonctionner correctement.2) Pourquoi ne voyez-vous pas que
NaN
sousstarting_membership
? Eh bien,NaN
est définie uniquement pour les flotteurs; il n'y a pas de "None" pour les entiers, de sorte qu'il jettenp.NaN
à un entier. Si vous souhaitez une autre valeur par défaut, vous pouvez changer cela dans lanp.full
appel.OriginalL'auteur Eric G.
Vous pouvez le faire comme ceci
OriginalL'auteur ryanjdillon
C'est une vieille question, mais je ne vois pas une réponse solide (bien que @eric_g était super proche).
Vous suffit de créer un vide dataframe avec une liste de clé de dictionnaire:paires de valeurs. La clé de votre nom de colonne, et la valeur à vide type de données.
Donc dans votre exemple de jeu de données, il se présenterait comme suit:
dict is unhashable type
(ce qui est compréhensible). Et, il n'y a aucune mention de ce format dans la documentation.Je suis activement à l'aide de ce dans mon code et il fonctionne très bien. Je suis en utilisant les pandas 0.22.0, que diriez-vous?
OriginalL'auteur SummerEla