Différents types d'éléments dans DataFrame de la colonne
Considérer trois DataFrame
's:
df1 = pd.DataFrame([[1,2],[4,3]])
df2 = pd.DataFrame([[1,.2],[4,3]])
df3 = pd.DataFrame([[1,'a'],[4,3]])
Ici sont les types de la deuxième colonne de la DataFrame
's:
In [56]: map(type,df1[1])
Out[56]: [numpy.int64, numpy.int64]
In [57]: map(type,df2[1])
Out[57]: [numpy.float64, numpy.float64]
In [58]: map(type,df3[1])
Out[58]: [str, int]
Dans le premier cas, tous les int
's sont projetées à numpy.int64
. Des beaux. Dans le troisième cas, il n'y a fondamentalement pas de conversion. Cependant, dans le second cas, l'entier (3
) est coulé à numpy.float64
; probablement depuis l'autre nombre est un float.
Comment puis-je contrôler le casting? Dans le second cas, je veux avoir soit [float64, int64]
ou [float, int]
comme des types.
Solution de contournement:
À l'aide d'un callable de la fonction d'impression il y a peut être une solution de contournement, comme l'ont montré ici.
def printFloat(x):
if np.modf(x)[0] == 0:
return str(int(x))
else:
return str(x)
pd.options.display.float_format = printFloat
Joli carnet! Je pense que c'est une bonne solution et le bon usage de la
Merci! Pouvez-vous suggérer une amélioration(s) à
Peut-être que l'utilisation de
float_format
.Merci! Pouvez-vous suggérer une amélioration(s) à
printFloat
?Peut-être que l'utilisation de
x % 1
travaille aussi à la place de np.modf
, et il est plus rapide, bien que je ne pense pas que la vitesse sera un problème (elle sont toujours un nombre limité d'éléments qui sont imprimés).
OriginalL'auteur Dror | 2014-12-08
Vous devez vous connecter pour publier un commentaire.
Les colonnes d'une pandas DataFrame (ou une Série) sont, de façon homogène, de type. Vous pouvez inspecter ce avec
dtype
(ouDataFrame.dtypes
):Seulement le générique
'object'
dtype peut contenir aucun objet python, et de cette façon peuvent également contenir un mélange de types:Mais ce n'est vraiment pas recommandé, car cela va à l'encontre de l'objectif (ou au moins la performance) des pandas.
Est-il une raison en particulier, vous vous souhaitez à la fois des entiers et des flottants dans la même colonne?
int
's et certains seulement parfloat
'. Pouvez a transposé la version de la table de servir comme une solution?Peut-être, mais alors l'apparition d'entiers/flotteurs sur des lignes différentes qui devrait arriver dans la même colonne. Mais encore, pourquoi ne pas représenter toutes les données que des flotteurs? (problème de mémoire?)
J'ai appris que si vous pouvez vous le représenter quelque chose comme un
int
, puis ne pas utiliserfloat
. Ainsi, la mémoire est une chose, la beauté de code est le second, et l'impression de données. Siint
's sont représentés commefloat
's, puis quandprint
'ed, il y a de gênant de fuite.00
"J'ai appris que si vous pouvez vous le représenter quelque chose comme un int, alors ne pas utiliser float" -> C'est certainement vrai en général, mais pas plus dans numpy (scientifique python) terre lorsque vous voulez mettre des données dans le même tableau (ou de la Série dans ce cas) et de faire performant d'analyse. Et si vous êtes inquiet au sujet de la mémoire, il peut être préférable d'étudier si vous avez besoin d'un int64/float64, peut-être int32/float32 peut être suffisant.
Difficile à dire sans connaître l'exacte application. Il dépend des caractéristiques de pandas que vous utilisez, la taille de votre jeu de données, .. Mais parfois, il est moins généraux de l'aide dicts/lists. Mais pour être honnête, dans la plupart des cas, je voudrais utiliser les pandas, mais ensuite, vous avez à vivre avec une colonne d'un type de problème de mise en forme (ou d'écrire une fonction d'impression personnalisée où le format de chaque valeur séparément en fonction de sa valeur)
OriginalL'auteur joris