Heim  >  Artikel  >  Backend-Entwicklung  >  Erste Schritte mit der Python-Datenverarbeitungsbibliothek Pandas

Erste Schritte mit der Python-Datenverarbeitungsbibliothek Pandas

不言
不言Original
2018-04-19 10:45:592278Durchsuche

Pandas ist ein Python-Sprachsoftwarepaket. Wenn wir die Python-Sprache für die Programmierung maschinellen Lernens verwenden, ist dies eine sehr häufig verwendete grundlegende Programmierbibliothek. Dieser Artikel ist ein Einführungs-Tutorial zur Python-Datenverarbeitungsbibliothek. Interessierte Freunde sollten einen Blick darauf werfen.

Pandas ist ein Python-Sprachsoftwarepaket Maschinelles Lernen ist eine sehr häufig verwendete grundlegende Programmierbibliothek. Dieser Artikel ist ein Einführungstutorial dazu.

Pandas bietet schnelle, flexible und ausdrucksstarke Datenstrukturen, die die Arbeit mit „relationalen“ oder „getaggten“ Daten einfach und intuitiv machen. Es soll ein High-Level-Baustein für die praktische Datenanalyse in Python sein.

Erste Schritte

Pandas eignet sich für viele verschiedene Arten von Daten, darunter:

  • Tabellarische Daten mit heterogenen Spaltentypen, wie SQL-Tabellen oder Excel-Daten

  • Geordnete und ungeordnete (nicht unbedingt feste Häufigkeit) Zeitreihendaten.

  • Beliebige Matrixdaten (einheitlichen oder unterschiedlichen Typs) mit Zeilen- und Spaltenbeschriftungen

  • Jede andere Form von Beobachtung/statistischem Datensatz.


Da es sich um ein Python-Sprachsoftwarepaket handelt, benötigen Sie zunächst eine Python-Sprachumgebung auf Ihrem Computer. Bitte recherchieren Sie diesbezüglich im Internet, wie Sie es erhalten können.

Informationen zum Erhalt von Pandas finden Sie in den Anweisungen auf der offiziellen Website: Pandas-Installation.

Normalerweise können wir die Installation über pip durchführen:

sudo pip3 install pandas


oder über conda to install Pandas:

conda install pandas


Derzeit (Februar 2018) ist die neueste Version von Pandas v0.22.0 (veröffentlicht: Dezember). 29, 2017).

Ich habe den Quellcode und die Testdaten dieses Artikels auf Github gestellt: pandas_tutorial, Leser können ihn sich holen.

Darüber hinaus wird Pandas häufig zusammen mit NumPy verwendet, und NumPy wird auch im Quellcode in diesem Artikel verwendet.

Es wird empfohlen, dass Leser sich mit NumPy vertraut machen, bevor sie Pandas lernen. Ich habe auch bereits ein grundlegendes Tutorial zu NumPy geschrieben, siehe hier: Python Machine Learning Library NumPy Tutorial

Kerndatenstruktur

Der Kern von Pandas sind die beiden Datenstrukturen Series und DataFrame.

Der Vergleich dieser beiden Arten von Datenstrukturen ist wie folgt:

DataFrame kann als Container einer Serie betrachtet werden, das heißt: ein DataFrame kann enthalten mehrere Serien.

Hinweis: Vor Version 0.20.0 gab es eine dreidimensionale Datenstruktur namens Panel. Aus diesem Grund heißt die Pandas-Bibliothek auch: pan-da-s. Diese Datenstruktur wurde jedoch aufgegeben, da sie selten verwendet wird.

Serien

Da es sich bei Serien um eindimensionale strukturierte Daten handelt, können wir diese Art von Daten direkt durch erstellen ein Array wie folgt:

# data_structure.py
import pandas as pd
import numpy as np
series1 = pd.Series([1, 2, 3, 4])
print("series1:\n{}\n".format(series1))

Die Ausgabe dieses Codes lautet wie folgt:

series1:
0 1
1 2
2 3
3 4
dtype: int64

Die Beschreibung dieser Ausgabe lautet wie folgt:

  • Die letzte Ausgabezeile ist der Datentyp in Serie, und die Daten hier sind alle vom Typ int64.

  • Die Daten werden in der zweiten Spalte ausgegeben, und die erste Spalte ist der Index der Daten, der in Pandas als Index bezeichnet wird.


Wir können die Daten und den Index in der Serie separat ausdrucken:

# data_structure.py
print("series1.values: {}\n".format(series1.values))
print("series1.index: {}\n".format(series1.index))

Die Ausgabe dieser beiden Codezeilen ist wie folgt:

series1.values: [1 2 3 4]
series1.index: RangeIndex(start=0, stop=4, step=1)

Wenn nicht angegeben (wie oben). ), der Index hat die Form [ 1, N-1]. Wir können den Index jedoch auch beim Erstellen der Serie angeben. Der Index muss nicht unbedingt eine Ganzzahl sein, er kann ein beliebiger Datentyp sein, beispielsweise eine Zeichenfolge. Beispielsweise verwenden wir sieben Buchstaben, um sieben Noten abzubilden. Der Zweck des Index besteht darin, die entsprechenden Daten zu erhalten, beispielsweise die folgenden:

# data_structure.py
series2 = pd.Series([1, 2, 3, 4, 5, 6, 7],
 index=["C", "D", "E", "F", "G", "A", "B"])
print("series2:\n{}\n".format(series2))
print("E is {}\n".format(series2["E"]))

Die Ausgabe dieses Codes lautet wie folgt:

series2:
C 1
D 2
E 3
F 4
G 5
A 6
B 7
dtype: int64
E is 3
DataFrame

Werfen wir einen Blick auf die Erstellung von DataFrame. Wir können über die NumPy-Schnittstelle eine 4x4-Matrix erstellen, um einen DataFrame zu erstellen, etwa so:

# data_structure.py
df1 = pd.DataFrame(np.arange(16).reshape(4,4))
print("df1:\n{}\n".format(df1))

Die Ausgabe dieses Codes lautet wie folgt:

df1:
 0 1 2 3
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
3 12 13 14 15

Aus dieser Ausgabe können wir ersehen, dass die Standardindex- und Spaltennamen die Form [0, N-1] haben.

Wir können beim Erstellen eines DataFrame Spaltennamen und Indizes wie folgt angeben:

# data_structure.py
df2 = pd.DataFrame(np.arange(16).reshape(4,4),
 columns=["column1", "column2", "column3", "column4"],
 index=["a", "b", "c", "d"])
print("df2:\n{}\n".format(df2))

Die Ausgabe dieses Codes ist wie folgt :

df2:
 column1 column2 column3 column4
a 0 1 2 3
b 4 5 6 7
c 8 9 10 11
d 12 13 14 15

Wir können Spaltendaten auch direkt angeben, um einen DataFrame zu erstellen:

# data_structure.py

df3 = pd.DataFrme({"note" : ["C", "D", "E", "F", "G", "A", "B"],
 "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]})
print("df3:\n{}\n".format(df3))

Die Ausgabe dieses Codes ist wie folgt:

df3:
 note weekday
0 C Mon
1 D Tue
2 E Wed
3 F Thu
4 G Fri
5 A Sat
6 B Sun


Bitte beachten Sie:

Die verschiedenen Spalten des DataFrame können unterschiedliche Datentypen sein

Wenn Sie einen DataFrame mit einem Series-Array erstellen, wird jede Series zu einer Zeile statt zu einer Spalte

Zum Beispiel:

# data_structure.py
noteSeries = pd.Series(["C", "D", "E", "F", "G", "A", "B"],
 index=[1, 2, 3, 4, 5, 6, 7])
weekdaySeries = pd.Series(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"],
 index=[1, 2, 3, 4, 5, 6, 7])
df4 = pd.DataFrame([noteSeries, weekdaySeries])
print("df4:\n{}\n".format(df4))

df4的输出如下:

df4:
 1 2 3 4 5 6 7
0 C D E F G A B
1 Mon Tue Wed Thu Fri Sat Sun

我们可以通过下面的形式给DataFrame添加或者删除列数据:

# data_structure.py
df3["No."] = pd.Series([1, 2, 3, 4, 5, 6, 7])
print("df3:\n{}\n".format(df3))
del df3["weekday"]
print("df3:\n{}\n".format(df3))


这段代码输出如下:

df3:
 note weekday No.
0 C Mon 1
1 D Tue 2
2 E Wed 3
3 F Thu 4
4 G Fri 5
5 A Sat 6
6 B Sun 7
df3:
 note No.
0 C 1
1 D 2
2 E 3
3 F 4
4 G 5
5 A 6
6 B 7

Index对象与数据访问

pandas的Index对象包含了描述轴的元数据信息。当创建Series或者DataFrame的时候,标签的数组或者序列会被转换成Index。可以通过下面的方式获取到DataFrame的列和行的Index对象:

# data_structure.py
print("df3.columns\n{}\n".format(df3.columns))
print("df3.index\n{}\n".format(df3.index))

这两行代码输出如下:

df3.columns
Index(['note', 'No.'], dtype='object')
df3.index
RangeIndex(start=0, stop=7, step=1)


请注意:

  • Index并非集合,因此其中可以包含重复的数据

  • Index对象的值是不可以改变,因此可以通过它安全的访问数据


DataFrame提供了下面两个操作符来访问其中的数据:

  • loc:通过行和列的索引来访问数据

  • iloc:通过行和列的下标来访问数据

例如这样:

# data_structure.py
print("Note C, D is:\n{}\n".format(df3.loc[[0, 1], "note"]))
print("Note C, D is:\n{}\n".format(df3.iloc[[0, 1], 0]))

第一行代码访问了行索引为0和1,列索引为“note”的元素。第二行代码访问了行下标为0和1(对于df3来说,行索引和行下标刚好是一样的,所以这里都是0和1,但它们却是不同的含义),列下标为0的元素。

这两行代码输出如下:

Note C, D is:
0 C
1 D
Name: note, dtype: object

Note C, D is:
0 C
1 D
Name: note, dtype: object

文件操作

pandas库提供了一系列的read_函数来读取各种格式的文件,它们如下所示:

  • read_csv

  • read_table

  • read_fwf

  • read_clipboard

  • read_excel

  • read_hdf

  • read_html

  • read_json

  • read_msgpack

  • read_pickle

  • read_sas

  • read_sql

  • read_stata

  • read_feather


读取Excel文件

注:要读取Excel文件,还需要安装另外一个库:xlrd

通过pip可以这样完成安装:

sudo pip3 install xlrd


安装完之后可以通过pip查看这个库的信息:

$ pip3 show xlrd
Name: xlrd
Version: 1.1.0
Summary: Library for developers to extract data from Microsoft Excel (tm) spreadsheet files
Home-page: http://www.python-excel.org/
Author: John Machin
Author-email: sjmachin@lexicon.net
License: BSD
Location: /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages
Requires:


接下来我们看一个读取Excel的简单的例子:

# file_operation.py
import pandas as pd
import numpy as np
df1 = pd.read_excel("data/test.xlsx")
print("df1:\n{}\n".format(df1))


这个Excel的内容如下:

df1:
 C Mon
0 D Tue
1 E Wed
2 F Thu
3 G Fri
4 A Sat
5 B Sun

注:本文的代码和数据文件可以通过文章开头提到的Github仓库获取。

读取CSV文件

下面,我们再来看读取CSV文件的例子。

第一个CSV文件内容如下:

$ cat test1.csv 
C,Mon
D,Tue
E,Wed
F,Thu
G,Fri
A,Sat

读取的方式也很简单:

# file_operation.py
df2 = pd.read_csv("data/test1.csv")
print("df2:\n{}\n".format(df2))

我们再来看第2个例子,这个文件的内容如下:

$ cat test2.csv 
C|Mon
D|Tue
E|Wed
F|Thu
G|Fri
A|Sat


严格的来说,这并不是一个CSV文件了,因为它的数据并不是通过逗号分隔的。在这种情况下,我们可以通过指定分隔符的方式来读取这个文件,像这样:

# file_operation.py
df3 = pd.read_csv("data/test2.csv", sep="|")
print("df3:\n{}\n".format(df3))

实际上,read_csv支持非常多的参数用来调整读取的参数,如下表所示:


详细的read_csv函数说明请参见这里:pandas.read_csv

处理无效值

现实世界并非完美,我们读取到的数据常常会带有一些无效值。如果没有处理好这些无效值,将对程序造成很大的干扰。

对待无效值,主要有两种处理方法:直接忽略这些无效值;或者将无效值替换成有效值。

下面我先创建一个包含无效值的数据结构。然后通过pandas.isna函数来确认哪些值是无效的:

# process_na.py
import pandas as pd
import numpy as np
df = pd.DataFrame([[1.0, np.nan, 3.0, 4.0],
   [5.0, np.nan, np.nan, 8.0],
   [9.0, np.nan, np.nan, 12.0],
   [13.0, np.nan, 15.0, 16.0]])
print("df:\n{}\n".format(df));
print("df:\n{}\n".format(pd.isna(df)));****

这段代码输出如下:

df:
 0 1 2 3
0 1.0 NaN 3.0 4.0
1 5.0 NaN NaN 8.0
2 9.0 NaN NaN 12.0
3 13.0 NaN 15.0 16.0
df:
 0 1 2 3
0 False True False False
1 False True True False
2 False True True False
3 False True False False

忽略无效值

我们可以通过pandas.DataFrame.dropna函数抛弃无效值:

# process_na.py
print("df.dropna():\n{}\n".format(df.dropna()));


注:dropna默认不会改变原先的数据结构,而是返回了一个新的数据结构。如果想要直接更改数据本身,可以在调用这个函数的时候传递参数 inplace = True。

对于原先的结构,当无效值全部被抛弃之后,将不再是一个有效的DataFrame,因此这行代码输出如下:

df.dropna():
Empty DataFrame
Columns: [0, 1, 2, 3]
Index: []


我们也可以选择抛弃整列都是无效值的那一列:

# process_na.py
print("df.dropna(axis=1, how='all'):\n{}\n".format(df.dropna(axis=1, how='all')));


注:axis=1表示列的轴。how可以取值'any'或者'all',默认是前者。

这行代码输出如下:

df.dropna(axis=1, how='all'):
 0 2 3
0 1.0 3.0 4.0
1 5.0 NaN 8.0
2 9.0 NaN 12.0
3 13.0 15.0 16.0

替换无效值

我们也可以通过fillna函数将无效值替换成为有效值。像这样:

# process_na.py
print("df.fillna(1):\n{}\n".format(df.fillna(1)));

这段代码输出如下:

df.fillna(1):
  0 1  2  3
0 1.0 1.0 3.0 4.0
1 5.0 1.0 1.0 8.0
2 9.0 1.0 1.0 12.0
3 13.0 1.0 15.0 16.0


将无效值全部替换成同样的数据可能意义不大,因此我们可以指定不同的数据来进行填充。为了便于操作,在填充之前,我们可以先通过rename方法修改行和列的名称:

# process_na.py

df.rename(index={0: 'index1', 1: 'index2', 2: 'index3', 3: 'index4'},
   columns={0: 'col1', 1: 'col2', 2: 'col3', 3: 'col4'},
   inplace=True);
df.fillna(value={'col2': 2}, inplace=True)
df.fillna(value={'col3': 7}, inplace=True)
print("df:\n{}\n".format(df));

这段代码输出如下:

df:
  col1 col2 col3 col4
index1 1.0 2.0 3.0 4.0
index2 5.0 2.0 7.0 8.0
index3 9.0 2.0 7.0 12.0
index4 13.0 2.0 15.0 16.0


处理字符串

数据中常常牵涉到字符串的处理,接下来我们就看看pandas对于字符串操作。

Series的str字段包含了一系列的函数用来处理字符串。并且,这些函数会自动处理无效值。

下面是一些实例,在第一组数据中,我们故意设置了一些包含空格字符串:

# process_string.py
import pandas as pd
s1 = pd.Series([' 1', '2 ', ' 3 ', '4', '5']);
print("s1.str.rstrip():\n{}\n".format(s1.str.lstrip()))
print("s1.str.strip():\n{}\n".format(s1.str.strip()))
print("s1.str.isdigit():\n{}\n".format(s1.str.isdigit()))

在这个实例中我们看到了对于字符串strip的处理以及判断字符串本身是否是数字,这段代码输出如下:

s1.str.rstrip():
0  1
1 2 
2 3 
3  4
4  5
dtype: object
s1.str.strip():
0 1
1 2
2 3
3 4
4 5
dtype: object
s1.str.isdigit():
0 False
1 False
2 False
3  True
4  True
dtype: bool


下面是另外一些示例,展示了对于字符串大写,小写以及字符串长度的处理:

# process_string.py
s2 = pd.Series(['Stairway to Heaven', 'Eruption', 'Freebird',
     'Comfortably Numb', 'All Along the Watchtower'])
print("s2.str.lower():\n{}\n".format(s2.str.lower()))
print("s2.str.upper():\n{}\n".format(s2.str.upper()))
print("s2.str.len():\n{}\n".format(s2.str.len()))


该段代码输出如下:

s2.str.lower():
0   stairway to heaven
1     eruption
2     freebird
3   comfortably numb
4 all along the watchtower
dtype: object

s2.str.upper():
0   STAIRWAY TO HEAVEN
1     ERUPTION
2     FREEBIRD
3   COMFORTABLY NUMB
4 ALL ALONG THE WATCHTOWER
dtype: object

s2.str.len():
0 18
1  8
2  8
3 16
4 24
dtype: int64

相关推荐:

Python数据分析库pandas基本操作方法_python

python之Numpy和Pandas的使用介绍

Parameter Beschreibung
Pfad Dateipfad
Trennzeichen oder Trennzeichen Feldtrennzeichen
Kopfzeile Die Anzahl der Zeilen im Spaltennamen, der Standardwert ist 0 (Erste Zeile)
index_col Die Spaltennummer oder der Name wird als Zeilenindex im Ergebnis verwendet
Namen Liste der Spaltennamen für das Ergebnis
Skiprows Anzahl der Zeilen, die von der Startposition aus übersprungen werden sollen
na_values Eine Folge von Werten, die NA
Kommentar Das Zeichen, das Kommentare durch Zeilenenden trennt
parse_dates versucht, die Daten in datetime zu analysieren. Standardmäßig ist False
keep_date_col Wenn Sie eine Spalte mit einem analysierten Datum verketten, behalten Sie die verkettete Spalte bei. Der Standardwert ist False.
Konverter Konverter für Spalten
dayfirst Beim Parsen werden Daten gespeichert, die zu Mehrdeutigkeiten führen können in innerer Form.Der Standardwert ist False
data_parser Funktion zum Analysieren von Daten
nrows von Die Anzahl der Zeilen, mit denen in der Datei mit dem Lesen begonnen werden soll
iterator Gibt ein TextParser-Objekt zum Lesen eines Teils des Inhalts zurück
chunksize Geben Sie die Größe des Leseblocks an
skip_footer Die Anzahl der Zeilen, die am Ende der Datei ignoriert werden sollen
ausführlich Verschiedene Parsing-Ausgabeinformationen ausgeben
Kodierung Dateikodierung
Squeeze Wenn die analysierten Daten nur eine Spalte enthalten, geben Sie ein Series
Tausender Tausendertrennzeichen

Das obige ist der detaillierte Inhalt vonErste Schritte mit der Python-Datenverarbeitungsbibliothek Pandas. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn