[Pandas-Funktion] Pandas apply()-Funktionsverwendung

Das Verständnis der Funktionen von Pandas erfordert ein bestimmtes Konzept und Verständnis der funktionalen Programmierung. Funktionale Programmierung, einschließlich des funktionalen Programmierdenkens, ist natürlich ein sehr kompliziertes Thema, aber für apply()die heute vorgestellten Funktionen nur verstehen: Als Objekt kann eine Funktion als Parameter an andere Parameter übergeben und als verwendet werden der Rückgabewert der Funktion.

Funktionen als Objekte können eine große Veränderung im Codierungsstil bewirken. Um ein Beispiel zu geben, gibt es eine Liste mit 1 bis 10, aus der Sie die durch 3 teilbare Zahl finden. Auf traditionelle Weise:

def can_divide_by_three(number):
    if number % 3 == 0:
        return True
    else:
        return False

selected_numbers = []
for number in range(1, 11):
    if can_divide_by_three(number):
        selected_numbers.append(number)

Die Schleife ist notwendig, da can_divide_by_three()die Funktion nur einmal verwendet wird und mit einem Lambda-Ausdruck vereinfacht werden kann:

divide_by_three = lambda x : True if x % 3 == 0 else False

selected_numbers = []
for number in range(1, 11):
    if divide_by_three(item):
        selected_numbers.append(item)

Dies ist die traditionelle Denkweise der Programmierung.Wenn wir die Methode der funktionalen Programmierung verwenden, können wir uns das so vorstellen: Nehmen Sie die Nummer einer bestimmten Regel aus einer Liste, können wir uns einfach auf diese Regel konzentrieren und diese Regel festlegen, und lassen Sie die Programmiersprache handhabt das Looping-Ding Wollstoff? Sicher. Wenn sich Programmierer nur um Regeln kümmern (eine Regel kann eine Bedingung sein oder durch eine bestimmte Funktion definiert werden), wird der Code stark vereinfacht und besser lesbar.

Die Python-Sprache stellt filter()die Funktion , die Syntax lautet wie folgt:

filter(function, sequence)

filter()Die Funktion der Funktion: führe function(item) sequentiell auf den Items in der Sequenz aus und bilde eine Liste/String/Tupel (abhängig vom Typ der Sequenz) der Items, deren Ergebnis True ist, und gib es zurück. Mit dieser Funktion kann der obige Code vereinfacht werden zu:

divide_by_three = lambda x : True if x % 3 == 0 else False
selected_numbers = filter(divide_by_three, range(1, 11))

Fügen Sie den Lambda-Ausdruck in die Anweisung ein, und der Code wird auf nur einen Satz vereinfacht:

selected_numbers = filter(lambda x: x % 3 == 0, range(1, 11))

Serie.apply()

Zurück zum Thema, apply()die Funktion kann auf Seriesoder das Ganze angewendet werden DataFrame, und die Funktion besteht darin, automatisch das Ganze Seriesoder DataFrame, um die angegebene Funktion für jedes Element auszuführen.

Um ein Beispiel zu geben, gibt es jetzt einen solchen Datensatz, die Testergebnisse der Schüler:

  Name Nationality  Score
   张           汉    400
   李           回    450
   王           汉    460

Wenn die ethnische Zugehörigkeit nicht Han ist, wird die Gesamtpunktzahl um 5 Punkte zur Testpunktzahl addiert. Jetzt müssen wir Pandas verwenden, um diese Berechnung durchzuführen, und die Methode zum Hinzufügen von Pandas-Spalten wird übernommen. Wenn es nur darum geht, das Ergebnis zu erhalten, numpy.where()ist die Funktion natürlich einfacher, hier soll hauptsächlich die Verwendung Series.apply()der Funktion .

import pandas as pd

df = pd.read_csv("studuent-score.csv")
df['ExtraScore'] = df['Nationality'].apply(lambda x : 5 if x != '汉' else 0)
df['TotalScore'] = df['Score'] + df['ExtraScore']

Für die Nationality-Spalte iteriert pandas über jeden Wert und führt die anonyme Lambda-Funktion für diesen Wert aus, speichert das Ergebnis Seriesin gibt es zurück. Das Ergebnis des obigen Codes, der im Jupyter-Notebook angezeigt wird, lautet wie folgt:

  Name Nationality  Score  ExtraScore  TotalScore
0    张           汉    400           0         400
1    李           回    450           5         455
2    王           汉    460           0         460

apply()Natürlich kann die Funktion auch die eingebauten Funktionen von Python ausführen, wenn wir zum Beispiel die Anzahl der Zeichen in der Name-Spalte bekommen wollen, wenn wir apply()verwenden

df['NameLength'] = df['Name'].apply(len)

DataFrame.apply()

DataFrame.apply()Die Funktion durchläuft jedes Element und führt die angegebene Funktion für das Element aus. Wie das folgende Beispiel:

import pandas as pd
import numpy as np

matrix = [
    [1,2,3],
    [4,5,6],
    [7,8,9]
]

df = pd.DataFrame(matrix, columns=list('xyz'), index=list('abc'))
df.apply(np.square)

Nach dem Ausführen square()der Funktion werden alle Elemente quadriert:

    x   y   z
a   1   4   9
b  16  25  36
c  49  64  81

Wenn Sie nur auf bestimmte Zeilen und Spalten apply()einwirken , können Sie Zeilen- oder Spaltenattribute namezur Begrenzung verwenden. Das folgende Beispiel quadriert beispielsweise die x-Spalte:

df.apply(lambda x : np.square(x) if x.name=='x' else x)

    x  y  z
a   1  2  3
b  16  5  6
c  49  8  9

Das folgende Beispiel quadriert die x- und y-Spalten:

df.apply(lambda x : np.square(x) if x.name in ['x', 'y'] else x)

    x   y  z
a   1   4  3
b  16  25  6
c  49  64  9

Das folgende Beispiel quadriert die erste Zeile (die Zeile mit der Beschriftung a):

df.apply(lambda x : np.square(x) if x.name == 'a' else x, axis=1)

Standardmäßig axis=0bedeutet spalten- und axis=1zeilenweise.

apply() berechnet Beispiel für eine Datumssubtraktion

Normalerweise verwenden wir häufig Datumsberechnungen, um beispielsweise das Intervall zwischen zwei Daten zu berechnen, wie z. B. den folgenden Datensatz über das Start- und Enddatum von wbs:

    wbs   date_from     date_to
  job1  2019-04-01  2019-05-01
  job2  2019-04-07  2019-05-17
  job3  2019-05-16  2019-05-31
  job4  2019-05-20  2019-06-11

Angenommen, Sie möchten die Anzahl der Tage zwischen Start- und Enddatum berechnen. Die einfachere Methode besteht darin, zwei Spalten (datetime-Typ) zu subtrahieren:

import pandas as pd
import datetime as dt

wbs = {
    "wbs": ["job1", "job2", "job3", "job4"],
    "date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
    "date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
}

df = pd.DataFrame(wbs)
df['elpased' = df['date_to'].apply(pd.to_datetime) -   
               df['date_from'].apply(pd.to_datetime)

apply()Die Funktion konvertiert date_fromund date_tozwei Spalten in den datetime-Typ. Lassen Sie uns df drucken:

    wbs   date_from     date_to elapsed
0  job1  2019-04-01  2019-05-01 30 days
1  job2  2019-04-07  2019-05-17 40 days
2  job3  2019-05-16  2019-05-31 15 days
3  job4  2019-05-20  2019-06-11 22 days

Das Datumsintervall wurde berechnet, aber es gibt eine Einheit Tage dahinter. Dies liegt daran, dass die beiden datetimeTypen subtrahiert werden und der resultierende Datentyp ist. Wenn nur Zahlen benötigt werden, müssen Sie das Attribut von verwendentimedelta64 , um es zu konvertieren.timedeltadays

elapsed= df['date_to'].apply(pd.to_datetime) -
    df['date_from'].apply(pd.to_datetime)
df['elapsed'] = elapsed.apply(lambda x : x.days)

Derselbe Effekt kann mit DataFrame.apply()der Funktion erzielt werden. Wir müssen zuerst eine Funktion definieren get_interval_days(). Die erste Spalte dieser Funktion ist eine Variable vom SeriesTyp . Bei der Ausführung wird jede Zeile des DataFrame der Reihe nach empfangen.

import pandas as pd
import datetime as dt

def get_interval_days(arrLike, start, end):   
    start_date = dt.datetime.strptime(arrLike[start], '%Y-%m-%d')
    end_date = dt.datetime.strptime(arrLike[end], '%Y-%m-%d') 

    return (end_date - start_date).days


wbs = {
    "wbs": ["job1", "job2", "job3", "job4"],
    "date_from": ["2019-04-01", "2019-04-07", "2019-05-16","2019-05-20"],
    "date_to": ["2019-05-01", "2019-05-17", "2019-05-31", "2019-06-11"]
}

df = pd.DataFrame(wbs)
df['elapsed'] = df.apply(
    get_interval_days, axis=1, args=('date_from', 'date_to'))

Referenz

Die Apply-Funktion von Pandas – die beste Funktion in Pandas


Autor: Stone0823
Link: https://www.jianshu.com/p/4fdd6eee1b06
Quelle: Jianshu
Das Urheberrecht liegt beim Autor. Für den kommerziellen Nachdruck wenden Sie sich bitte zwecks Genehmigung an den Autor, für den nicht kommerziellen Nachdruck geben Sie bitte die Quelle an.

Guess you like

Origin blog.csdn.net/qq_42200107/article/details/126061079