[PYTHON] Comment convertir des données détenues horizontalement en données détenues verticalement avec des pandas

Commencez par préparer la trame de données ci-dessous.

Préparation de DataFrame


import pandas as pd
 
values = [['1', 'John', 'somekey1-1', 'somevalue1-1', 'time1-1', 'somekey2-1', 'somevalue2-1', 'time2-1'],
          ['2', 'Tom', 'somekey1-2', 'somevalue1-2', 'time1-2', 'somekey2-2', 'somevalue2-2', 'time2-2'],]
df = pd.DataFrame(values, columns=['id', 'name', 'key1', 'value1', 'time1', 'key2', 'value2', 'time2'])
df

Les données suivantes sont créées avec le code ci-dessus.

id name key1 value1 time1 key2 value2 time2
0 1 John somekey1-1 somevalue1-1 time1-1 somekey2-1 somevalue2-1 time2-1
1 2 Tom somekey1-2 somevalue1-2 time1-2 somekey2-2 somevalue2-2 time2-2

J'introduirai quatre codes qui convertissent ces informations en données verticales comme indiqué ci-dessous.

id name key value time
0 1 John somekey1-1 somevalue1-1 time1-1
1 2 Tom somekey1-2 somevalue1-2 time1-2
2 1 John somekey2-1 somevalue2-1 time2-1
3 2 Tom somekey2-2 somevalue2-2 time2-2

Comment faire avec la méthode de fusion

Il semble qu'il soit courant d'utiliser la méthode de fusion, et cette information était abondante. Il existe plusieurs façons de créer un tableau de colonnes, je vais donc l'inclure également.

Créer un tableau de noms de colonnes


#Motif ①
columns = df.columns.tolist()
[value for value in columns if value.startswith('key')]

#Motif ②
df.columns[df.columns.str.startswith('key')].tolist()

#résultat
# ['key1', 'key2']

Le motif ①, qui crée et déplace une fois un tableau de colonnes, semble se déplacer plus léger, donc J'utilise ça ci-dessous.

Convertir en données verticales à l'aide de la fusion


columns = df.columns.tolist()

pd.concat(
    [pd.melt(df, id_vars=['id', 'name'], value_vars=[value for value in columns if value.startswith('key')], value_name='key'),
     pd.melt(df, value_vars=[value for value in columns if value.startswith('value')], value_name='value'),
     pd.melt(df, value_vars=[value for value in columns if value.startswith('time')], value_name='time')
     ],
     axis=1
     ).drop('variable', axis=1)

Comment implémenter avec la méthode wide_to_long

wide_to_long est assez simple car vous pouvez le créer en une seule ligne. Je n'ai pas compris au début quand j'ai regardé le site ci-dessous, https://pandas.pydata.org/docs/reference/api/pandas.wide_to_long.html

Dans le tableau spécifié par le deuxième argument, `convertir une colonne commençant par un caractère spécifique en maintien vertical Parce qu'il bouge, il est possible de le compléter en une seule ligne.

La partie restante de la colonne est spécifiée par «j» S'il s'agit de «key1», créez-le avec le nom de colonne spécifié, et s'il s'agit de «key2», créez-le avec «2». Dans le code ci-dessous, une colonne appelée'drop'est créée, donc après cela, elle est supprimée par la méthode drop.

wide_to_Convertir en données verticales en utilisant long


pd.wide_to_long(df, ['key','value','time'], i='id', j='drop').reset_index().drop('drop', axis=1)

Si vous obtenez une erreur avec wide_to_long

Que faire si vous obtenez l'erreur suivante L'erreur suivante est une erreur qui se produit lorsqu'il existe des éléments d'ID en double.

error


ValueError: the id variables need to uniquely identify each row

Par exemple, si vous modifiez un peu le premier bloc de données et que vous l'exécutez avec les deux identifiants définis sur «1», vous obtiendrez une erreur.

DataFrame avec une erreur


import pandas as pd
 
values = [['1', 'John', 'somekey1-1', 'somevalue1-1', 'time1-1', 'somekey2-1', 'somevalue2-1', 'time2-1'],
          ['1', 'Tom', 'somekey1-2', 'somevalue1-2', 'time1-2', 'somekey2-2', 'somevalue2-2', 'time2-2'],]
df = pd.DataFrame(values, columns=['id', 'name', 'key1', 'value1', 'time1', 'key2', 'value2', 'time2'])

pd.wide_to_long(df,['key','value','time'], i='id', j='drop').reset_index().drop('drop', axis=1)

Dans ce cas, vous pouvez le résoudre en créant un élément d'index avec reset_index () et en le spécifiant dans id.

wide_to_Convertir en données verticales en utilisant long(Méthode d'évitement des erreurs)


pd.wide_to_long(df.reset_index(), ['key','value','time'], i='index', j='drop').reset_index().drop('drop', axis=1).drop('index', axis=1)

Comment faire avec la méthode lreshape

lreshape semble être une méthode mineure qui peut être corrigée pour remodeler même si vous recherchez sur google. Personnellement, je l'aime parce que c'est simple, mais le site ci-dessous dit qu'il disparaîtra dans le futur, il semble donc qu'il ne sera pas utilisable bientôt. Pardon. https://pandas.pydata.org/pandas-docs/version/1.0.0/whatsnew/v1.0.0.html

Convertir en données verticales à l'aide de lreshape


d = {'key': df.columns[df.columns.str.startswith('key')].tolist(),
     'value': df.columns[df.columns.str.startswith('value')].tolist(),
     'time': df.columns[df.columns.str.startswith('time')].tolist(),}

pd.lreshape(df, d)

De plus, bien qu'il faille écrire qu'il est utilisé dans la pratique, pour une raison quelconque, ce qui suit Il semble préférable de ne pas trop l'utiliser car cela peut provoquer des erreurs.

error


/usr/local/lib/python3.6/dist-packages/pandas/core/reshape/melt.py in <dictcomp>(.0)
    188             mask &= notna(mdata[c])
    189         if not mask.all():
--> 190             mdata = {k: v[mask] for k, v in mdata.items()}
    191 
    192     return data._constructor(mdata, columns=id_cols + pivot_cols)

IndexError: boolean index did not match indexed array along dimension 0; dimension is 1210 but corresponding boolean dimension is 24200

Comment faire de son mieux avec concat

Probablement pas très bien. Quand je ne connaissais pas la méthode ci-dessus au début, je l'ai fait.

Lors de l'utilisation de la méthode concat si les noms de colonne sont identiques C'est une méthode pour l'utiliser car il se joint verticalement.

Implémentation avec concat


pd.concat([
    df[['id', 'name', 'key1', 'value1', 'time1']].rename(columns={'key1': 'key', 'value1': 'value', 'time1': 'time'}),
    df[['id', 'name', 'key2', 'value2', 'time2']].rename(columns={'key2': 'key', 'value2': 'value', 'time2': 'time'}),
])

Recommended Posts

Comment convertir des données détenues horizontalement en données détenues verticalement avec des pandas
Convertir 202003 en 2020-03 avec les pandas
Je souhaite convertir des données détenues verticalement (type long) en données détenues horizontalement (type large)
Comment extraire des données qui ne manquent pas de valeur nan avec des pandas
Comment convertir un fichier JSON en fichier CSV avec Python Pandas
Comment extraire des données qui ne manquent pas de valeur nan avec des pandas
Comment gérer les données déséquilibrées
Comment augmenter les données avec PyTorch
Convertir des données Excel en JSON avec python
Convertir les données de la grille en données contenant des lignes (?) À l'aide de pandas
Convertissez des données FX 1 minute en données 5 minutes avec Python
Essayez de convertir en données ordonnées avec les pandas
Comment lire les données de problème avec Paiza
Comment créer des exemples de données CSV avec hypothèse
Convertissez les données avec la forme (nombre de données, 1) en (nombre de données,) avec numpy.
[Python] Comment lire des fichiers Excel avec des pandas
Comment récupérer des données de courses de chevaux avec Beautiful Soup
Comment convertir (32,32,3) en tenseur à 4 dimensions (1,32,32,1) avec le type ndarray
Comment utiliser Pandas 2
Visualisation des données avec les pandas
Manipulation des données avec les Pandas!
Mélangez les données avec les pandas
Convertissez l'historique d'utilisation de Suica mobile au format PDF au format pandas Data Frame avec tabula-py
Comment convertir / restaurer une chaîne avec [] en python
Comment utiliser xgboost: classification multi-classes avec des données d'iris
Comment récupérer des données d'image de Flickr avec Python
Comment convertir un objet de classe en dictionnaire avec SQLAlchemy
Comment accéder avec cache lors de la lecture_json avec pandas
Comment obtenir plus de 1000 données avec SQLAlchemy + MySQLdb
Comment extraire des valeurs Null et des valeurs non Null avec des pandas
Comment générer un CSV d'en-tête multiligne avec des pandas
[Python] Comment gérer l'erreur de lecture pandas read_html
[Python] Un mémo pour écrire du CSV verticalement avec Pandas
Convertissez les variables numériques en variables catégorielles avec les pandas en définissant un seuil
[Python] Convertir la liste en Pandas [Pandas]
Comment mettre à jour avec SQLAlchemy?
Comment utiliser Pandas Rolling
Comment lancer avec Theano
Comment modifier avec SQLAlchemy?
Comment séparer les chaînes avec ','
Comment faire RDP sur Fedora31
Comment gérer les trames de données
Conseils de traitement des données avec Pandas
Comment supprimer avec SQLAlchemy?
Comment convertir un tableau en dictionnaire avec Python [Application]
Ingéniosité pour gérer les données avec Pandas de manière à économiser la mémoire
Comment obtenir un aperçu de vos données dans Pandas
Comment lire un fichier Excel (.xlsx) avec Pandas [Python]
Comment créer une trame de données et jouer avec des éléments avec des pandas
Compagnon de science des données en python, comment spécifier des éléments dans les pandas
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Comment annuler RT avec Tweepy
Comment extraire des fonctionnalités de données de séries chronologiques avec les bases de PySpark
[Python] Comment FFT des données mp3
Python: comment utiliser async avec
Comment lire les données de la sous-région e-Stat
Comment écrire sobrement avec des pandas
[Python] Comment utiliser la série Pandas
[Analyse du cours de l'action] Apprenez les pandas avec la moyenne Nikkei (004: Changer les données lues en moyenne Nikkei)