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 |
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 |
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 |
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 |
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 |
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 |
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 |
#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 |
#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 |
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))
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 |
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 |
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 |
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