In Fortsetzung von Letztes Mal möchte ich diesmal die Prozesse zusammenfassen, die häufig beim Referenzieren und Bearbeiten von Daten verwendet werden.
Führen Sie zunächst den folgenden Code aus, um einen Beispieldatenrahmen zu erstellen.
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 |
Wenn durch den Spaltennamen (Spaltenname) angegeben, sind die Daten der entsprechenden Spalte Sie können es im Serienformat erhalten.
df['name']
name | |
---|---|
0 | userA |
1 | userB |
2 | userC |
3 | userD |
4 | userE |
Wenn Sie in der Liste der Spaltennamen (Spaltennamen) angeben, werden die Daten der entsprechenden Spalte (Plural) angezeigt. Es kann in Form von DataFrame bezogen werden.
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 |
Wenn Sie einen neuen Spaltennamen angeben und eine Zuweisungsoperation ausführen, wird die Spalte hinzugefügt.
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 |
Wenn Sie nur bestimmte Zeilendaten abrufen möchten, geben Sie in der loc-Methode einen Index an. Sie können die Daten der angegebenen Zeile im Serienformat abrufen.
df.loc[0]
name | age | sex | price | |
---|---|---|---|---|
0 | userA | 20 | male | 10000 |
Wenn Sie mehrere Datenzeilen abrufen möchten, geben Sie eine Liste der Indizes in der loc-Methode an. Sie können alle Daten in der angegebenen Zeile im DataFrame-Format abrufen.
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 |
Es ist keine sehr häufige Operation, aber wenn Sie den Index- und Spaltennamen in der loc-Methode angeben, Es kann nur das angegebene Element erfasst werden.
df.loc[1, 'sex']
# female
#Wenn Sie dem oben erhaltenen Element eine Zuordnung vornehmen, wird diese aktualisiert.
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 |
#Zum Beispiel beim Extrahieren von Zeilen ab 25 Jahren
df[(df['age'] >= 25)]
#Am Anfang~Wenn Sie hinzufügen, wird es NICHT
df[~(df['age'] >= 25)]
#Beim Extrahieren von Zeilen mit UND
df[(df['age'] >= 25) & (df['sex'] == 'female')]
#Beim Extrahieren von Zeilen mit ODER
df[(df['age'] < 25) | (df['age'] > 40)]
Das folgende Beispiel zeigt das Extrahieren von Zeilen mit AND.
name | age | sex | price | |
---|---|---|---|---|
1 | userB | 25 | female | 10000 |
2 | userC | 41 | female | 10000 |
#Dies ist praktisch, wenn Sie das Ergebnis der Berechnung von Statistiken für jede Kategorie zum ursprünglichen Datenrahmen hinzufügen möchten.
#Im Folgenden wird das Durchschnittsalter für jedes Geschlecht berechnet
#Andere Statistiken können berechnet werden, indem das für die Transformation angegebene Argument geändert wird.
df['average_age_by_sex'] = df.groupby('sex')['age'].transform('mean')
#Wenn Sie nur den Durchschnitt mit Jupiter-Notebook usw. sehen möchten, ist Folgendes in Ordnung
# 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 |
Bei Iterrows sind der Index und die Daten in dieser Zeile zeilenweise im Serienformat. Sie können es bei bekommen. Wenn jedoch die Anzahl der Zeilen im Datenrahmen zunimmt, verlangsamt sich die Verarbeitung, sodass ich denke, dass der Datenrahmen etwa 100 Zeilen umfasst und nur verwendet werden kann, wenn Sie ein wenig überspringen möchten.
for index, row in df.iterrows():
print(index)
print(type(row))
In Fällen wie dem Titel und wenn Sie die if-Anweisung verwenden möchten, möchten Sie zeilenweise mit iterrows verarbeiten. In den meisten Fällen ist es jedoch besser, unter dem Gesichtspunkt der Verarbeitungsgeschwindigkeit anzuhalten. ist. In diesem Fall können Sie den Prozess mithilfe der unten gezeigten Apply-Methode beschleunigen.
df['age_boundary'] = df['age'].apply(lambda x: '25 Jahre und älter' if x >=25 else 'Unter 25 Jahren')
#Selbst wenn Sie eine Funktion definieren und an die Methode apply übergeben, ist das Ergebnis dasselbe
# def get_age_boundary(age):
# if age >= 25:
# return '25 Jahre und älter'
# else:
# return 'Unter 25 Jahren'
# df['age_boundary'] = df['age'].apply(get_age_boundary)
name | age | sex | price | age_boundary | |
---|---|---|---|---|---|
0 | userA | 20 | male | 10000 | Unter 25 Jahren |
1 | userB | 25 | female | 10000 | 25 Jahre und älter |
2 | userC | 41 | female | 10000 | 25 Jahre und älter |
3 | userD | 33 | male | 10000 | 25 Jahre und älter |
4 | userE | 22 | male | 10000 | Unter 25 Jahren |
In einigen Fällen müssen Sie möglicherweise auf mehrere Spalten verweisen, um eine neue Spalte zu erstellen. In diesem Fall können Sie auf den Wert jeder Spalte für jede Zeile verweisen, indem Sie das Argument axis = 1 der Methode apply angeben.
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 |
Im obigen Fall, in dem eine neue Spalte unter Bezugnahme auf mehrere Spalten erstellt wurde, haben wir die Methode zum Angeben des Arguments Achse = 1 der Methode apply angewendet. Diese Methode weist jedoch ein Problem hinsichtlich der Verarbeitungsgeschwindigkeit auf. Als Alternative zu den oben genannten habe ich es in der Praxis nicht verwendet, aber Sie können die Verwendung der Vektorisierungsmethode von Numpy in Betracht ziehen.
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 |
Konvertieren zwischen Pandas Series-, NumPy ndarray- und Python-Standardlisten Ich vergesse es oft, deshalb werde ich es hier zusammenfassen.
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])
Beim Schreiben dieses Artikels habe ich auf die folgenden Websites verwiesen. 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