14 ..
Über NaN von DataFrame
import numpy as np
import pandas as pd
df = pd.read_csv('train.csv')
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
Alle Datensätze, die NaN enthalten, wurden gelöscht. (Index bleibt gleich. Grundsätzlich wird der Index nur neu zugewiesen, wenn .reset_index ()
df.dropna().head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
6 |
7 |
0 |
1 |
McCarthy, Mr. Timothy J |
male |
54.0 |
0 |
0 |
17463 |
51.8625 |
E46 |
S |
10 |
11 |
1 |
3 |
Sandstrom, Miss. Marguerite Rut |
female |
4.0 |
1 |
1 |
PP 9549 |
16.7000 |
G6 |
S |
11 |
12 |
1 |
1 |
Bonnell, Miss. Elizabeth |
female |
58.0 |
0 |
0 |
113783 |
26.5500 |
C103 |
S |
Sie können eine Spalte mit NaN löschen, indem Sie Achse = 1 als Argument verwenden (Standard ist Linie mit Achse = 0).
nicht sehr oft verwenden. Beim Erstellen eines Modells wird es in der Strategie verwendet, die Variablen (erklärende Variablen) zu reduzieren, die die Daten erklären, ohne die Anzahl der Daten zu verringern. Es ist jedoch unwahrscheinlich, dass "die erklärenden Variablen reduziert werden, weil es sogar ein NaN gibt". .. Welche erklärenden Variablen für die Modellbildung wichtig sind, ist eine sehr wichtige und sorgfältige Frage.
df.dropna(axis=1) .head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
SibSp |
Parch |
Ticket |
Fare |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
1 |
0 |
A/5 21171 |
7.2500 |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
1 |
0 |
PC 17599 |
71.2833 |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
1 |
0 |
113803 |
53.1000 |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
0 |
0 |
373450 |
8.0500 |
Durch Übergeben einer Liste von Spaltennamen an das Teilmengenargument werden nur die Zeilen gelöscht, die NaN in dieser Spalte enthalten.
Sie müssen nur die NaN-Zeile in einer bestimmten Spalte ablegen. Denken Sie daran, es ist sehr praktisch.
Natürlich überschreibt .dropna () den ursprünglichen df nicht. Wenn Sie das ursprüngliche df aktualisieren möchten, weisen Sie es dem vertrauten inplace = True oder df = df.dropna () zu.
df.dropna(subset=['Age']).head() ###index=888 wird fallen gelassen.
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
.fillna(value)
Weisen Sie NaN einen bestimmten Wert zu.
df.fillna('THIS IS IT').head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22 |
1 |
0 |
A/5 21171 |
7.2500 |
THIS IS IT |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
THIS IS IT |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35 |
0 |
0 |
373450 |
8.0500 |
THIS IS IT |
S |
Ersetzen Sie NaN in einer bestimmten Spalte durch den Spaltenmittelwert
df['Age'].mean()
29.69911764705882
df['Age'].fillna(df['Age'].mean()).head()
0 22.0
1 38.0
2 26.0
3 35.0
4 35.0
Name: Age, dtype: float64
df['Age'] = df['Age'].fillna(df['Age'].mean())
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
pd.isna(df).head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
True |
False |
1 |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
2 |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
True |
False |
3 |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
4 |
False |
False |
False |
False |
False |
False |
False |
False |
False |
False |
True |
False |
Ersetzen Sie das NaN-Beurteilungsergebnis von Cabin durch die Spalte Cabin_nan
df['Cabin_nan'] = pd.isna(df['Cabin'])
df
15 ..
groupby mit .groupby () function ()
df = pd.read_csv('train.csv')
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
Gruppieren Sie nach in Klasse
Da df.groupby ('Pclass') allein nicht weiß, was nach dem Gruppieren und Gruppieren zu tun ist, rufen Sie Funktionen wie .mean () und .count () auf.
df.groupby('Pclass').mean()
|
PassengerId |
Survived |
Age |
SibSp |
Parch |
Fare |
Pclass |
|
|
|
|
|
|
1 |
461.597222 |
0.629630 |
38.233441 |
0.416667 |
0.356481 |
84.154687 |
2 |
445.956522 |
0.472826 |
29.877630 |
0.402174 |
0.380435 |
20.662183 |
3 |
439.154786 |
0.242363 |
25.140620 |
0.615071 |
0.393075 |
13.675550 |
df = df[df['Pclass']==1]
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
6 |
7 |
0 |
1 |
McCarthy, Mr. Timothy J |
male |
54.0 |
0 |
0 |
17463 |
51.8625 |
E46 |
S |
11 |
12 |
1 |
1 |
Bonnell, Miss. Elizabeth |
female |
58.0 |
0 |
0 |
113783 |
26.5500 |
C103 |
S |
23 |
24 |
1 |
1 |
Sloper, Mr. William Thompson |
male |
28.0 |
0 |
0 |
113788 |
35.5000 |
A6 |
S |
Nehmen Sie Statistiken für jede Spalte mit 'Klasse' == 1
df[df['Pclass']==1].describe()
|
PassengerId |
Survived |
Pclass |
Age |
SibSp |
Parch |
Fare |
count |
216.000000 |
216.000000 |
216.0 |
186.000000 |
216.000000 |
216.000000 |
216.000000 |
mean |
461.597222 |
0.629630 |
1.0 |
38.233441 |
0.416667 |
0.356481 |
84.154687 |
std |
246.737616 |
0.484026 |
0.0 |
14.802856 |
0.611898 |
0.693997 |
78.380373 |
min |
2.000000 |
0.000000 |
1.0 |
0.920000 |
0.000000 |
0.000000 |
0.000000 |
25% |
270.750000 |
0.000000 |
1.0 |
27.000000 |
0.000000 |
0.000000 |
30.923950 |
50% |
472.000000 |
1.000000 |
1.0 |
37.000000 |
0.000000 |
0.000000 |
60.287500 |
75% |
670.500000 |
1.000000 |
1.0 |
49.000000 |
1.000000 |
0.000000 |
93.500000 |
max |
890.000000 |
1.000000 |
1.0 |
80.000000 |
3.000000 |
4.000000 |
512.329200 |
Nur Mittelwert extrahieren
Es ist schwierig, sie einzeln herauszunehmen, daher ist es eine gute Idee, .groupby () zu verwenden, um sie alle zusammen zu sehen.
df[df['Pclass']==1].describe().loc['mean']
PassengerId 461.597222
Survived 0.629630
Pclass 1.000000
Age 38.233441
SibSp 0.416667
Parch 0.356481
Fare 84.154687
Name: mean, dtype: float64
Nehmen Sie nach groupby den im Index angegebenen Wert für by, das erste Argument von groupby,. Im obigen Beispiel ist dies der Wert von Pclass (1, 2, 3). Das Ergebnis von grouby ist natürlich auch ein DataFrame, sodass Sie mit .loc [] eine bestimmte Gruppe von Serien abrufen können.
df.groupby('Pclass').mean().loc[1]
PassengerId 461.597222
Survived 0.629630
Age 38.233441
SibSp 0.416667
Parch 0.356481
Fare 84.154687
Name: 1, dtype: float64
df.groupby('Pclass').count().loc[1] #count()Und Summe()Usw. sind ebenfalls möglich
PassengerId 216
Survived 216
Name 216
Sex 216
Age 186
SibSp 216
Parch 216
Ticket 216
Fare 216
Cabin 176
Embarked 214
Name: 1, dtype: int64
df.groupby('Pclass').describe()
|
PassengerId |
Survived |
Age |
SibSp |
Parch |
Fare |
|
count |
mean |
std |
min |
25% |
50% |
75% |
max |
count |
mean |
std |
min |
25% |
50% |
75% |
max |
count |
mean |
std |
min |
25% |
50% |
75% |
max |
count |
mean |
std |
min |
25% |
50% |
75% |
max |
count |
mean |
std |
min |
25% |
50% |
75% |
max |
count |
mean |
std |
min |
25% |
50% |
75% |
max |
Pclass |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
216.0 |
461.597222 |
246.737616 |
2.0 |
270.75 |
472.0 |
670.5 |
890.0 |
216.0 |
0.629630 |
0.484026 |
0.0 |
0.0 |
1.0 |
1.0 |
1.0 |
186.0 |
38.233441 |
14.802856 |
0.92 |
27.0 |
37.0 |
49.0 |
80.0 |
216.0 |
0.416667 |
0.611898 |
0.0 |
0.0 |
0.0 |
1.0 |
3.0 |
216.0 |
0.356481 |
0.693997 |
0.0 |
0.0 |
0.0 |
0.0 |
4.0 |
216.0 |
84.154687 |
78.380373 |
0.0 |
30.92395 |
60.2875 |
93.5 |
512.3292 |
2 |
184.0 |
445.956522 |
250.852161 |
10.0 |
234.50 |
435.5 |
668.0 |
887.0 |
184.0 |
0.472826 |
0.500623 |
0.0 |
0.0 |
0.0 |
1.0 |
1.0 |
173.0 |
29.877630 |
14.001077 |
0.67 |
23.0 |
29.0 |
36.0 |
70.0 |
184.0 |
0.402174 |
0.601633 |
0.0 |
0.0 |
0.0 |
1.0 |
3.0 |
184.0 |
0.380435 |
0.690963 |
0.0 |
0.0 |
0.0 |
1.0 |
3.0 |
184.0 |
20.662183 |
13.417399 |
0.0 |
13.00000 |
14.2500 |
26.0 |
73.5000 |
3 |
491.0 |
439.154786 |
264.441453 |
1.0 |
200.00 |
432.0 |
666.5 |
891.0 |
491.0 |
0.242363 |
0.428949 |
0.0 |
0.0 |
0.0 |
0.0 |
1.0 |
355.0 |
25.140620 |
12.495398 |
0.42 |
18.0 |
24.0 |
32.0 |
74.0 |
491.0 |
0.615071 |
1.374883 |
0.0 |
0.0 |
0.0 |
1.0 |
8.0 |
491.0 |
0.393075 |
0.888861 |
0.0 |
0.0 |
0.0 |
0.0 |
6.0 |
491.0 |
13.675550 |
11.778142 |
0.0 |
7.75000 |
8.0500 |
15.5 |
69.5500 |
df.groupby('Pclass').describe()['Age'] #Ich habe nur Age rausgenommen
|
count |
mean |
std |
min |
25% |
50% |
75% |
max |
Pclass |
|
|
|
|
|
|
|
|
1 |
186.0 |
38.233441 |
14.802856 |
0.92 |
27.0 |
37.0 |
49.0 |
80.0 |
2 |
173.0 |
29.877630 |
14.001077 |
0.67 |
23.0 |
29.0 |
36.0 |
70.0 |
3 |
355.0 |
25.140620 |
12.495398 |
0.42 |
18.0 |
24.0 |
32.0 |
74.0 |
Wenn in Jupyter die Spalten und Zeilen des DataFrame nicht angezeigt werden können, werden sie weggelassen.
Wenn Sie alle Spalten (oder alle Zeilen) anzeigen möchten, ohne sie wegzulassen, können Sie verhindern, dass sie weggelassen werden, indem Sie Folgendes ausführen.
#Anzeige ohne Auslassen von Spalten
pd.set_option('display.max_columns', None)
#Anzeige ohne Auslassen von Linien
pd.set_option('display.max_rows', None)
Drehen Sie das Ergebnis der Gruppe mit einer for-Anweisung um
for i, group_df in df.groupby('Pclass'):
print("{}: group_df's type is {} and has {}".format(i, type(group_df), len(group_df)))
1: group_df's type is <class 'pandas.core.frame.DataFrame'> and has 216
2: group_df's type is <class 'pandas.core.frame.DataFrame'> and has 184
3: group_df's type is <class 'pandas.core.frame.DataFrame'> and has 491
Nummerieren Sie den höchsten Tarif für jeden Datensatz in jeder Pclass-Gruppe
df = pd.read_csv('train.csv')
results = []
for i, group_df in df.groupby('Pclass'):
sorted_group_df = group_df.sort_values('Fare')
sorted_group_df['RankInClass'] = np.arange(len(sorted_group_df))
results.append(sorted_group_df)
results_df = pd.concat(results)
results_df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
RankInClass |
633 |
634 |
0 |
1 |
Parr, Mr. William Henry Marsh |
male |
NaN |
0 |
0 |
112052 |
0.0 |
NaN |
S |
0 |
822 |
823 |
0 |
1 |
Reuchlin, Jonkheer. John George |
male |
38.0 |
0 |
0 |
19972 |
0.0 |
NaN |
S |
1 |
815 |
816 |
0 |
1 |
Fry, Mr. Richard |
male |
NaN |
0 |
0 |
112058 |
0.0 |
B102 |
S |
2 |
806 |
807 |
0 |
1 |
Andrews, Mr. Thomas Jr |
male |
39.0 |
0 |
0 |
112050 |
0.0 |
A36 |
S |
3 |
263 |
264 |
0 |
1 |
Harrison, Mr. William |
male |
40.0 |
0 |
0 |
112059 |
0.0 |
B94 |
S |
4 |
Tisch verbinden
Es gibt zwei Haupttypen von Tabellenverknüpfungen.
Verbinden Sie sich, indem Sie eine bestimmte Spalte oder einen bestimmten Index als Schlüssel verwenden
Kombinieren Sie DataFrames einfach horizontal (oder vertikal) (oder vertikal).
import pandas as pd
df1 = pd.DataFrame({'Key':['k0','k','k2'],
'A':['a0','a1','a2'],
'B':['b0','b1','b2']})
df2 = pd.DataFrame({'Key':['k0','k1','k2'],
'C':['c0','c2','c3'],
'D':['d0','d1','d2']})
df1
|
Key |
A |
B |
0 |
k0 |
a0 |
b0 |
1 |
k |
a1 |
b1 |
2 |
k2 |
a2 |
b2 |
df2
|
Key |
C |
D |
0 |
k0 |
c0 |
d0 |
1 |
k1 |
c2 |
d1 |
2 |
k2 |
c3 |
d2 |
Beide haben eine Spalte namens "Key" und ihre Werte sind gleich.
Die anderen Spalten haben unterschiedliche Werte. Diese Spalte mit dem Namen "Schlüssel" wird als Schlüssel verwendet, um zwei DataFrames horizontal zu verbinden. Verwenden Sie zum Zusammenführen .merge ().
df1.merge(df2)
|
Key |
A |
B |
C |
D |
0 |
k0 |
a0 |
b0 |
c0 |
d0 |
1 |
k2 |
a2 |
b2 |
c3 |
d2 |
Kombinieren Sie DataFrames einfach horizontal (oder vertikal) (oder vertikal).
Verwenden Sie pd.concat () concat = concatenate
#Vertikal (oft verwendet)
pd.concat([df1,df2], axis=0) #Der Standardwert ist Achse=0
/opt/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:2: FutureWarning: Sorting because non-concatenation axis is not aligned. A future version
of pandas will change to not sort by default.
To accept the future behavior, pass 'sort=False'.
To retain the current behavior and silence the warning, pass 'sort=True'.
|
A |
B |
C |
D |
Key |
0 |
a0 |
b0 |
NaN |
NaN |
k0 |
1 |
a1 |
b1 |
NaN |
NaN |
k |
2 |
a2 |
b2 |
NaN |
NaN |
k2 |
0 |
NaN |
NaN |
c0 |
d0 |
k0 |
1 |
NaN |
NaN |
c2 |
d1 |
k1 |
2 |
NaN |
NaN |
c3 |
d2 |
k2 |
#Seite
pd.concat([df1,df2], axis=1)
|
Key |
A |
B |
Key |
C |
D |
0 |
k0 |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k |
a1 |
b1 |
k1 |
c2 |
d1 |
2 |
k2 |
a2 |
b2 |
k2 |
c3 |
d2 |
16 ..
Verwendung von .merge ()
wie: Wie kombiniert man → {'links', 'rechts', 'außen', 'inner'}, Standard ist 'inner'
Geben Sie die Spalte an, die aktiviert werden soll: key (Spalte, die in beiden DataFrames vorhanden ist). Wenn nicht angegeben, werden sie in einer gemeinsamen Spalte zusammengefasst.
left_on: Spalte, die der Schlüssel des linken DataFrame sein soll
right_on: Spalte als Schlüssel für den richtigen DataFrame
left_index: Geben Sie True an, wenn Sie den linken Schlüssel auf Index setzen
right_index: Geben Sie True an, wenn Sie den Schlüssel für das Indexieren festlegen
how
df1
|
Key |
A |
B |
0 |
k0 |
a0 |
b0 |
1 |
k |
a1 |
b1 |
2 |
k2 |
a2 |
b2 |
df2
|
Key |
C |
D |
0 |
k0 |
c0 |
d0 |
1 |
k1 |
c2 |
d1 |
2 |
k2 |
c3 |
d2 |
df1.merge(df2, how='left')
|
Key |
A |
B |
C |
D |
0 |
k0 |
a0 |
b0 |
c0 |
d0 |
1 |
k |
a1 |
b1 |
NaN |
NaN |
2 |
k2 |
a2 |
b2 |
c3 |
d2 |
df1.merge(df2, how='outer')
|
Key |
A |
B |
C |
D |
0 |
k0 |
a0 |
b0 |
c0 |
d0 |
1 |
k |
a1 |
b1 |
NaN |
NaN |
2 |
k2 |
a2 |
b2 |
c3 |
d2 |
3 |
k1 |
NaN |
NaN |
c2 |
d1 |
df1.merge(df2, how='inner')
|
Key |
A |
B |
C |
D |
0 |
k0 |
a0 |
b0 |
c0 |
d0 |
1 |
k2 |
a2 |
b2 |
c3 |
d2 |
on
Das Argument on gibt an, welche Spalte beim Beitritt als Schlüssel verwendet werden soll. Sie können nur Spalten angeben, die sich sowohl in der linken als auch in der rechten Tabelle befinden.
Wenn es eine gemeinsame Spalte gibt, ist diese Spalte der Schlüssel und wird kombiniert, ohne etwas anzugeben. Geben wir jedoch die Grundlagen an. Es ist leicht zu verstehen und sicher. Es wird oft gesagt, dass "sie in einer unerwarteten Spalte verbunden wurden". Wenn mehrere gemeinsame Spalten vorhanden sind, wissen Sie nicht, welche Spalte verbunden werden soll, und selbst wenn nur eine gemeinsame Spalte vorhanden ist, ist es besser, diese anzugeben. (Da die Beispiele bisher vor der Erklärung von on lagen, habe ich sie absichtlich geschrieben, ohne das Argument on anzugeben.)
Um den Index auf Key zu setzen, setzen Sie right_index und left_index, die später beschrieben werden, auf True. Wenn die Spaltennamen jeder Tabelle (DataFrame) unterschiedlich sind, geben Sie left_on und right_on an, die später beschrieben werden.
df1 = pd.DataFrame({'Key':['k0','k1','k2'],
'ID':['aa','bb','cc'],
'A':['a0','a1','a2'],
'B':['b0','b1','b2']})
df2 = pd.DataFrame({'Key':['k0','k1','k3'],
'ID':['aa','bb','cc'],
'C':['c0','c1','c3'],
'D':['d0','d1','d3']})
df1.merge(df2, on='Key')
|
Key |
ID_x |
A |
B |
ID_y |
C |
D |
0 |
k0 |
aa |
a0 |
b0 |
aa |
c0 |
d0 |
1 |
k1 |
bb |
a1 |
b1 |
bb |
c1 |
d1 |
df1.merge(df2, on='ID')
|
Key_x |
ID |
A |
B |
Key_y |
C |
D |
0 |
k0 |
aa |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k1 |
bb |
a1 |
b1 |
k1 |
c1 |
d1 |
2 |
k2 |
cc |
a2 |
b2 |
k3 |
c3 |
d3 |
Suffix ändern
df1.merge(df2, on='ID', suffixes=('_left', '_right'))
|
Key_left |
ID |
A |
B |
Key_right |
C |
D |
0 |
k0 |
aa |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k1 |
bb |
a1 |
b1 |
k1 |
c1 |
d1 |
2 |
k2 |
cc |
a2 |
b2 |
k3 |
c3 |
d3 |
left_on, right_on
Geben Sie dieses Argument an, wenn der Spaltenname, den Sie als Schlüssel verwenden möchten, zwischen links und rechts unterschiedlich ist.
df1 = pd.DataFrame({'Key1':['k0','k1','k2'],
'A':['a0','a1','a2'],
'B':['b0','b1','b2']})
df2 = pd.DataFrame({'Key2':['k0','k1','k3'],
'C':['c0','c1','c3'],
'D':['d0','d1','d3']})
df1.merge(df2, left_on='Key1', right_on='Key2')
|
Key1 |
A |
B |
Key2 |
C |
D |
0 |
k0 |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k1 |
a1 |
b1 |
k1 |
c1 |
d1 |
left_index, right_index
Wenn Sie Index als Schlüssel anstelle von Spalte angeben möchten, geben Sie True für left_index und right_index an.
df1.merge(df2, left_index=True, right_index=True)
|
Key1 |
A |
B |
Key2 |
C |
D |
0 |
k0 |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k1 |
a1 |
b1 |
k1 |
c1 |
d1 |
2 |
k2 |
a2 |
b2 |
k3 |
c3 |
d3 |
join
Wenn Sie die Join-Funktion verwenden, wird sie nach Index verknüpft, Sie müssen sich jedoch nicht daran erinnern, da Sie mit Merge fast dasselbe tun können.
df1 = pd.DataFrame({'Key1':['k0','k1','k2'],
'A':['a0','a1','a2'],
'B':['b0','b1','b2']})
df2 = pd.DataFrame({'Key2':['k0','k1','k3'],
'C':['c0','c1','c3'],
'D':['d0','d1','d3']})
df1.join(df2)
|
Key1 |
A |
B |
Key2 |
C |
D |
0 |
k0 |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k1 |
a1 |
b1 |
k1 |
c1 |
d1 |
2 |
k2 |
a2 |
b2 |
k3 |
c3 |
d3 |
df1.merge(df2, left_index=True, right_index=True)
|
Key1 |
A |
B |
Key2 |
C |
D |
0 |
k0 |
a0 |
b0 |
k0 |
c0 |
d0 |
1 |
k1 |
a1 |
b1 |
k1 |
c1 |
d1 |
2 |
k2 |
a2 |
b2 |
k3 |
c3 |
d3 |
df1 = pd.DataFrame({'Key1':['k0','k1','k2'],
'A':['a0','a1','a2'],
'B':['b0','b1','b2']})
df2 = pd.DataFrame({'Key2':['k0','k1','k3'],
'C':['c0','c1','c3'],
'D':['d0','d1','d3']})
df3 = pd.DataFrame({'Key3':['k0','k1','k4'],
'E':['c0','c1','c3'],
'F':['d0','d1','d3']})
df1.join([df2, df3])
|
Key1 |
A |
B |
Key2 |
C |
D |
Key3 |
E |
F |
0 |
k0 |
a0 |
b0 |
k0 |
c0 |
d0 |
k0 |
c0 |
d0 |
1 |
k1 |
a1 |
b1 |
k1 |
c1 |
d1 |
k1 |
c1 |
d1 |
2 |
k2 |
a2 |
b2 |
k3 |
c3 |
d3 |
k4 |
c3 |
d3 |
17 ..
.unique() .nunique()
import pandas as pd
df = pd.read_csv('train.csv')
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
df['Pclass'].unique()
array([3, 1, 2])
df['Pclass'].nunique()
3
.value_counts()
df['Pclass'].value_counts()
3 491
1 216
2 184
Name: Pclass, dtype: int64
(Super wichtig) .apply ()
Mit der Funktion apply () können Sie alle Datensätze in einem DataFrame verarbeiten und die Ergebnisse in einer separaten Spalte speichern. Es ist ein Bild, das die Verarbeitung auf jede Zeile anwendet
def get_age_group(age):
return str(age)[0] + '0s'
get_age_group(45)
'40s'
df = pd.DataFrame({'name':['John','Mike','Emily'],
'age':['23','36','42']})
df
|
name |
age |
0 |
John |
23 |
1 |
Mike |
36 |
2 |
Emily |
42 |
df['age'].apply(get_age_group)
0 20s
1 30s
2 40s
Name: age, dtype: object
Verwendung von .apply () mit Lambda-Funktion
#Weisen Sie der Variablen f in der Lambda-Funktion zu
f = lambda x: str(x)[0] + '0s'
#Setzen Sie 43 als Probe
f(43)
'40s'
df['age_group'] = df['age'].apply(lambda x: str(x)[0] + '0s')
df
|
name |
age |
age_group |
0 |
John |
23 |
20s |
1 |
Mike |
36 |
30s |
2 |
Emily |
42 |
40s |
Verwendung von .apply () für den gesamten Datensatz
df = pd.DataFrame({'name':['John','Mike','Emily'],
'age':['23','36','42']})
df['description'] = df.apply(lambda row:'{} is {} years old'.format(row['name'], row['age']), axis=1)
df
|
name |
age |
description |
0 |
John |
23 |
John is 23 years old |
1 |
Mike |
36 |
Mike is 36 years old |
2 |
Emily |
42 |
Emily is 42 years old |
18 ..
Speichern Sie DataFrame im CSV-Format mit .to_csv ()
df = pd.read_csv('train.csv')
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
df['Adult'] = df['Age'].apply(lambda x: x>20)
df.tail()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
Adult |
886 |
887 |
0 |
2 |
Montvila, Rev. Juozas |
male |
27.0 |
0 |
0 |
211536 |
13.00 |
NaN |
S |
True |
887 |
888 |
1 |
1 |
Graham, Miss. Margaret Edith |
female |
19.0 |
0 |
0 |
112053 |
30.00 |
B42 |
S |
False |
888 |
889 |
0 |
3 |
Johnston, Miss. Catherine Helen "Carrie" |
female |
NaN |
1 |
2 |
W./C. 6607 |
23.45 |
NaN |
S |
False |
889 |
890 |
1 |
1 |
Behr, Mr. Karl Howell |
male |
26.0 |
0 |
0 |
111369 |
30.00 |
C148 |
C |
True |
890 |
891 |
0 |
3 |
Dooley, Mr. Patrick |
male |
32.0 |
0 |
0 |
370376 |
7.75 |
NaN |
Q |
True |
df.to_csv('train_w_adult.csv')
df = pd.read_csv('train_w_adult.csv')
df.head(3)
|
Unnamed: 0 |
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
Adult |
0 |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
True |
1 |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
True |
2 |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
True |
Mit Blick auf das Ergebnis von df.head (3) werden die Indexinformationen, als sie das letzte Mal gespeichert wurden, in der mysteriösen Spalte "Unbenannt: 0" gespeichert.
Wenn Sie in .to_csv () index = False angeben, müssen Sie den Index nicht speichern. Geben Sie grundsätzlich immer index = False an und speichern Sie es im CSV-Format.
Beachten Sie, dass dieselbe Datei, die bereits im Speicherziel vorhanden ist, überschrieben wird.
df = pd.read_csv('train.csv')
df['Adult'] = df['Age'].apply(lambda x: x>20)
df.to_csv('train_w_adult.csv', index=False)
df = pd.read_csv('train_w_adult.csv')
df.head(3)
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
Adult |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
True |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
True |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
True |
df = pd.DataFrame({'A':[['a', 'b'], 2, 3], 'B':[['c', 'd'], 5, 6]})
df
|
A |
B |
0 |
[a, b] |
[c, d] |
1 |
2 |
5 |
2 |
3 |
6 |
#Stellen Sie sicher, dass die gespeicherten Werte eine Liste sind.
type(df['A'].iloc[0])
list
#Speichern Sie mit csv
df.to_csv('temp.csv', index=False)
#Laden Sie die gespeicherte CSV
df = pd.read_csv('temp.csv')
df
|
A |
B |
0 |
['a', 'b'] |
['c', 'd'] |
1 |
2 |
5 |
2 |
3 |
6 |
type(df['A'].iloc[0])
str
Iterieren Sie DataFrame mit .iterrows ()
Es wird verwendet, wenn ein DataFrame mit einer for-Anweisung iteriert wird. Es ist schwer zu merken, aber da "Zeilen" "Iteration" ist, erinnern wir uns an iter + row + s. Da es mit for gedreht werden kann, nehmen wir an, dass es mehrere s gibt.
"Iteration" bedeutet, den Vorgang zu wiederholen. Es ist eine Schleife. Wenn es sich beispielsweise um eine Liste handelt, kann sie mit i in list iteriert werden: (siehe Teil 4).
In DataFrame können Sie nicht direkt für i in df sagen: wie eine Liste. Schreiben Sie wie folgt mit einer Funktion namens .iterrows ().
df = pd.read_csv('train.csv')
for idx, row in df.iterrows():
if row['Age'] > 40 and row['Pclass'] == 3 and row['Sex'] == 'male' and row['Survived'] == 1:
print('{} is very lucky guy...!'.format(row['Name']))
Dahl, Mr. Karl Edwart is very lucky guy...!
Sundman, Mr. Johan Julian is very lucky guy...!
In .apply () wird es häufig verwendet, wenn das Ergebnis der Verarbeitung jedes Datensatzes in einer anderen Spalte gespeichert wird, und in dieser .iterows () wird es häufig verwendet, wenn Sie nur verarbeiten möchten, anstatt einen Wert zurückzugeben.
Beispielsweise wird der Dateipfad in DataFrame gespeichert und .iterrows () wird zum Verschieben oder Lesen der Datei verwendet.
Sortieren Sie nach einer bestimmten Spalte mit .sort_values ()
#Nach Alter sortieren
df.sort_values('Age')
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
Erstellen Sie eine Pivot-Tabelle mit .pivot_table ()
data = {'Data':['Jan-1','Jan-1','Jan-1','Jan-2','Jan-2','Jan-2'],
'User':['Emily', 'John','Nick','Kevin','Emily','John'],
'Method':['Card','Card','Cash','Card','Cash','Cash'],
'Price':[100,250,200,460,200,130]}
df = pd.DataFrame(data)
df
|
Data |
User |
Method |
Price |
0 |
Jan-1 |
Emily |
Card |
100 |
1 |
Jan-1 |
John |
Card |
250 |
2 |
Jan-1 |
Nick |
Cash |
200 |
3 |
Jan-2 |
Kevin |
Card |
460 |
4 |
Jan-2 |
Emily |
Cash |
200 |
5 |
Jan-2 |
John |
Cash |
130 |
Geben Sie unter Werte die Spalte ein, die Sie aggregieren möchten. Diesmal ist es Preis.
Zunächst wird in jede Zelle der durch Werte angegebene Wert (in diesem Fall Preis) eingegeben. Dies ist die Spalte, die Sie aggregieren möchten.
Übergeben Sie andererseits einfach die Spalten, für die Sie Index und Spalten in einer Liste angeben möchten.
df.pivot_table(values='Price', index=['Data', 'User'], columns=['Method'])
|
Method |
Card |
Cash |
Data |
User |
|
|
Jan-1 |
Emily |
100.0 |
NaN |
John |
250.0 |
NaN |
Nick |
NaN |
200.0 |
Jan-2 |
Emily |
NaN |
200.0 |
John |
NaN |
130.0 |
Kevin |
460.0 |
NaN |
df.pivot_table(values='Price', index=['Data', 'Method'], columns=['User'])
|
User |
Emily |
John |
Kevin |
Nick |
Data |
Method |
|
|
|
|
Jan-1 |
Card |
100.0 |
250.0 |
NaN |
NaN |
Cash |
NaN |
NaN |
NaN |
200.0 |
Jan-2 |
Card |
NaN |
NaN |
460.0 |
NaN |
Cash |
200.0 |
130.0 |
NaN |
NaN |
Klären Sie zuerst "welche Spalte Sie aggregieren möchten" und fügen Sie diese Spalte in Werte ein. Fügen Sie dann einfach die gewünschten Informationen in Index und Spalten ein.
Querschnittsoperation mit .xs ()
.xs () ist eine Abkürzung für Querschnitt. Ich benutze auch nicht so viel, aber es ist praktisch, wenn ich mit DataFrames arbeite, die mehrere Indizes haben, wie z. B. Pivots. Es ist eine gute Idee, sich zusammen mit dem Drehpunkt daran zu erinnern.
Was Sie mit dieser .xs () tun müssen, ist, sie in der obigen Pivot-Tabelle zu verwenden, wenn Sie beispielsweise nur die Zeile "Karte" extrahieren möchten. (Genauer Querschnitt)
#pivot.xs('Card', level = 'Method')