[PYTHON] Résumé des processus souvent effectués par Pandas 2 (référence des données, opération d'édition)

Dans la continuité de Dernière fois, cette fois, je voudrais résumer les processus qui sont souvent utilisés lors du référencement et de l'édition des données.

Tout d'abord, exécutez le code ci-dessous pour créer un exemple de bloc de données.

import pandas as pd

df = pd.DataFrame({
    'name' : ['userA', 'userB', 'userC', 'userD', 'userE'],
    'age' : [20, 25, 41, 33, 22],
    'sex' : ['male', 'female', 'female', 'male', 'male'],
    'price' : 10000
})
name age sex price
0 userA 20 male 10000
1 userB 25 female 10000
2 userC 41 female 10000
3 userD 33 male 10000
4 userE 22 male 10000

Pour obtenir une colonne spécifique

Si spécifié par le nom de la colonne (nom de la colonne), les données de la colonne correspondante seront Vous pouvez l'obtenir au format Series.

df['name']
name
0 userA
1 userB
2 userC
3 userD
4 userE

Lors de la récupération de plusieurs colonnes

Si vous spécifiez dans la liste des noms de colonnes (noms de colonnes), les données de la colonne correspondante (au pluriel) seront affichées. Il peut être obtenu sous la forme de DataFrame.

target_columns_list = ['name', 'age']
df[target_columns_list]
name age
0 userA 20
1 userB 25
2 userC 41
3 userD 33
4 userE 22

Lors de l'ajout d'une nouvelle colonne

Si vous spécifiez un nouveau nom de colonne et effectuez une opération d'affectation, la colonne sera ajoutée.

df['new'] = df['age'] * 10
name age sex price new
0 userA 20 male 10000 200
1 userB 25 female 10000 250
2 userC 41 female 10000 410
3 userD 33 male 10000 330
4 userE 22 male 10000 220

Lors de la récupération uniquement de données de ligne spécifiques

Si vous souhaitez obtenir uniquement des données de ligne spécifiques, spécifiez un index dans la méthode loc. Vous pouvez obtenir les données de la ligne spécifiée au format Série.

df.loc[0]
name age sex price
0 userA 20 male 10000

Lors de la récupération de plusieurs lignes de données

Si vous souhaitez obtenir plusieurs lignes de données, spécifiez une liste d'index dans la méthode loc. Vous pouvez obtenir toutes les données de la ligne spécifiée au format DataFrame.

target_index_list = [0, 1, 2]
df.loc[target_index_list]
name age sex price
0 userA 20 male 10000
1 userB 25 female 10000
2 userC 41 female 10000

Lors de la récupération de données en spécifiant des lignes et des colonnes

Ce n'est pas une opération très fréquente, mais si vous spécifiez l'index et le nom de la colonne dans la méthode loc, Seul l'élément spécifié peut être acquis.


df.loc[1, 'sex']
# female

#Si vous affectez l'élément obtenu ci-dessus, il sera mis à jour.
df.loc[1, 'sex'] = 'updated'
name age sex price
0 userA 20 male 10000
1 userB 25 updated 10000
2 userC 41 female 10000
3 userD 33 male 10000
4 userE 22 male 10000

Lors de l'extraction de lignes en spécifiant des conditions

#Par exemple, lors de l'extraction de lignes âgées de 25 ans ou plus
df[(df['age'] >= 25)]

#Au début~Si vous ajoutez, cela devient NON
df[~(df['age'] >= 25)]

#Lors de l'extraction de lignes avec ET
df[(df['age'] >= 25) & (df['sex'] == 'female')]

#Lors de l'extraction de lignes avec OU
df[(df['age'] < 25) | (df['age'] > 40)]

Voici un exemple d'extraction de lignes avec AND.

name age sex price
1 userB 25 female 10000
2 userC 41 female 10000

Lors du calcul des statistiques avec groupby

#Ceci est pratique lorsque vous souhaitez ajouter le résultat du calcul des statistiques pour chaque catégorie au bloc de données d'origine.
#Ce qui suit calcule l'âge moyen pour chaque sexe
#D'autres statistiques peuvent être calculées en modifiant l'argument spécifié pour la transformation.
df['average_age_by_sex'] = df.groupby('sex')['age'].transform('mean')

#Si vous voulez juste voir la moyenne avec le notebook jupyter etc., ce qui suit est OK
# df.groupby('sex')['age'].mean()
name age sex price new average_age_by_sex
0 userA 20 male 10000 200 25
1 userB 25 female 10000 250 33
2 userC 41 female 10000 410 33
3 userD 33 male 10000 330 25
4 userE 22 male 10000 220 25

Lors de la mise en œuvre du traitement de boucle le plus simple dans Pandas

Avec iterrows, l'index et les données de cette ligne sont au format Série, ligne par ligne. Vous pouvez l'obtenir à. Cependant, si le nombre de lignes dans la trame de données augmente, le traitement ralentira, donc je pense que la trame de données est d'environ 100 lignes, et il est limité à une utilisation lorsque vous voulez sauter un peu.

for index, row in df.iterrows():
    print(index)
    print(type(row))

Lors de la création d'une nouvelle colonne en faisant référence à une colonne spécifique

Dans le cas comme le titre, et lorsque vous souhaitez utiliser l'instruction if, vous souhaiterez traiter ligne par ligne en utilisant iterrows, mais dans la plupart des cas, il est préférable de s'arrêter du point de vue de la vitesse de traitement. est. Dans ce cas, vous pouvez accélérer le processus en utilisant la méthode apply comme indiqué ci-dessous.

df['age_boundary'] = df['age'].apply(lambda x: '25 ans et plus' if x >=25 else 'Moins de 25 ans')

#Même si vous définissez une fonction et la transmettez à la méthode apply, le résultat est le même
# def get_age_boundary(age):
#     if age >= 25:
#         return '25 ans et plus'
#     else:
#         return 'Moins de 25 ans'

# df['age_boundary'] = df['age'].apply(get_age_boundary)

name age sex price age_boundary
0 userA 20 male 10000 Moins de 25 ans
1 userB 25 female 10000 25 ans et plus
2 userC 41 female 10000 25 ans et plus
3 userD 33 male 10000 25 ans et plus
4 userE 22 male 10000 Moins de 25 ans

Lors de la création d'une nouvelle colonne en faisant référence à plusieurs colonnes

Dans certains cas, vous devrez peut-être faire référence à plusieurs colonnes pour créer une nouvelle colonne. Dans ce cas, vous pouvez faire référence à la valeur de chaque colonne pour chaque ligne en spécifiant l'argument axis = 1 de la méthode apply.

def get_price_with_discount_rate(row):

    age = row['age']
    price = row['price']
    
    discount_rate = 1.0
    
    if age >= 40:
        discount_rate = 0.5
            
    return int(price * discount_rate)

df['price_with_discount_rate'] = df.apply(get_price_with_discount_rate, axis=1)

name age sex price price_with_discount_rate
0 userA 20 male 10000 10000
1 userB 25 female 10000 10000
2 userC 41 female 10000 5000
3 userD 33 male 10000 10000
4 userE 22 male 10000 10000

Lors de l'utilisation de np.vectorize

Dans le cas ci-dessus de création d'une nouvelle colonne en faisant référence à plusieurs colonnes, nous avons pris la méthode de spécification de l'argument axis = 1 de la méthode apply, mais cette méthode pose un problème en termes de vitesse de traitement. Comme alternative à ce qui précède, je ne l'ai pas utilisé dans la pratique, mais vous voudrez peut-être envisager d'utiliser la méthode de vectorisation de Numpy.

import numpy as np

def get_price_with_discount_rate(age, price):
        
    discount_rate = 1.0
    
    if age >= 40:
        discount_rate = 0.5
            
    return int(price * discount_rate)

vectorized_func=np.vectorize(get_price_with_discount_rate)
df['price_with_discount_rate'] = vectorized_func(df['age'], df['price'])

name age sex price price_with_discount_rate
0 userA 20 male 10000 10000
1 userB 25 female 10000 10000
2 userC 41 female 10000 5000
3 userD 33 male 10000 10000
4 userE 22 male 10000 10000

Conversion mutuelle de série, ndarray, liste

Comment convertir entre la série Pandas, le ndarray NumPy et la liste standard Python Je l'oublie souvent, je vais donc le résumer ici.


import numpy as np

# Series → ndarray
df['name'].values

# ndarray → list
df['name'].values.tolist()

# list → Series
pd.Series([1, 2, 3, 4, 5])

# list → ndarray
np.array([1, 2, 3, 4, 5])


En écrivant cet article, j'ai fait référence aux sites suivants. http://sinhrks.hatenablog.com/entry/2015/07/11/223124 https://qiita.com/3x8tacorice/items/3cc5399e18a7e3f9db86 https://note.nkmk.me/python-pandas-numpy-conversion/

Recommended Posts

Résumé des processus souvent effectués par Pandas 2 (référence des données, opération d'édition)
Résumé de la grammaire fréquemment utilisée dans les pandas
Résumé des méthodes fréquemment utilisées chez les pandas
Traitement des mémos souvent utilisés dans les pandas (débutants)
Conseils de traitement des données avec Pandas
Vérifiez le résumé des données dans CASTable
Résumé des processus souvent effectués par Pandas 1 (CSV, opérations liées aux fichiers Excel)
Résumé des distributions de probabilité qui apparaissent souvent dans les statistiques et l'analyse des données
Les données RDS via la plate-forme pas à pas sont envoyées aux Pandas
Gérez les structures de données 3D avec les pandas
Exemple de traitement efficace des données avec PANDAS