J'ai le DataFrame suivant à partir d'une requête SQL:
(Pdb) pp total_rows
ColumnID RespondentCount
0 -1 2
1 3030096843 1
2 3030096845 1
et je veux le faire pivoter comme ceci:
total_data = total_rows.pivot_table(cols=['ColumnID'])
(Pdb) pp total_data
ColumnID -1 3030096843 3030096845
RespondentCount 2 1 1
[1 rows x 3 columns]
total_rows.pivot_table(cols=['ColumnID']).to_dict('records')[0]
{3030096843: 1, 3030096845: 1, -1: 2}
mais je veux m'assurer que les 303 colonnes sont converties en chaînes au lieu d'entiers afin que j'obtienne ceci:
{'3030096843': 1, '3030096845': 1, -1: 2}
astype("string")
au lieu deastype(str)
pour de très bonnes raisons, jetez un œil.Réponses:
Une façon de convertir en chaîne consiste à utiliser un type :
Cependant, vous recherchez peut-être la
to_json
fonction, qui convertira les clés en json valide (et donc vos clés en chaînes):Remarque: vous pouvez passer un tampon / fichier dans lequel enregistrer cela, ainsi que d'autres options ...
la source
to_json()
n'appelle probablement pasastype(str)
car il quitte datetime64 et ses sous-classes en millisecondes depuis l'époque.Si vous avez besoin de convertir TOUTES les colonnes en chaînes, vous pouvez simplement utiliser:
Ceci est utile si vous avez besoin de tout sauf quelques colonnes pour être des chaînes / objets, puis revenez en arrière et convertissez les autres en tout ce dont vous avez besoin (entier dans ce cas):
la source
Voici l'autre, particulièrement utile pour convertir les multiples colonnes en chaîne au lieu d'une seule colonne:
la source
Utilisez .astype (str)
Ex:
Soit d le Pandas DataFrame
d['Column_name'].astype(str)
la source
pandas> = 1.0: Il est temps d'arrêter d'utiliser
astype(str)
!Avant Pandas 1.0 (enfin, 0.25 en fait), c'était la façon de facto de déclarer une série / colonne comme une chaîne:
À partir de pandas 1.0, envisagez d'utiliser le
"string"
type à la place.Voici pourquoi, comme cité par la documentation:
Voir également la section sur les différences de comportement entre
"string"
etobject
.Les types d'extensions (introduits dans 0.24 et formalisés dans 1.0) sont plus proches des pandas que numpy, ce qui est bien car les types numpy ne sont pas assez puissants. Par exemple, NumPy n'a aucun moyen de représenter les données manquantes dans des données entières (depuis
type(NaN) == float
). Mais les pandas peuvent utiliser des colonnes Nullable Integer .Pourquoi devrais-je arrêter de l'utiliser?
Mélange accidentel de dtypes
La première raison, comme indiqué dans la documentation, est que vous pouvez accidentellement stocker des données non textuelles dans des colonnes d'objets.
Difficulté à différencier les chaînes et les autres objets python
Un autre exemple évident est qu'il est plus difficile de faire la distinction entre les "chaînes" et les "objets". Les objets sont essentiellement le type de couverture pour tout type qui ne prend pas en charge les opérations vectorisables .
Considérer,
Jusqu'à pandas 0.25, il n'y avait pratiquement aucun moyen de distinguer que "A" et "B" n'ont pas le même type de données.
Depuis pandas 1.0, cela devient beaucoup plus simple:
Lisibilité
Cela va de soi ;-)
OK, devrais-je arrêter de l'utiliser maintenant?
...Non. Au moment de la rédaction de cette réponse (version 1.1), il n'y a aucun avantage en termes de performances, mais la documentation s'attend à des améliorations futures pour améliorer considérablement les performances et réduire l'utilisation de la mémoire pour les
"string"
colonnes par opposition aux objets. Cela dit, cependant, il n'est jamais trop tôt pour prendre de bonnes habitudes!la source
L'utilisation
.apply()
avec unelambda
fonction de conversion fonctionne également dans ce cas:total_rows['ColumnID'] = total_rows['ColumnID'].apply(lambda x: str(x))
Pour des dataframes entiers, vous pouvez utiliser
.applymap()
. (mais en tout cas.astype()
est probablement plus rapide)la source