核心数据结构
pandas最核心的就是Series
和DataFrame
两个数据结构。
名称 | 维度 | 说明 |
---|---|---|
Series | 1维 | 带有标签的同构类型数组 |
DataFrame | 2维 | 表格结构,带有标签,大小可变,且可以包含异构的数据列 |
DataFrame可以看做是Series的容器,即:一个DataFrame中可以包含若干个Series。
series
由于Series是一堆结构的数据,我们可以直接通过数组来创建这种数据,像这样:
import pandas as pd import numpy as np series1 = pd.Series([1, 2, 3, 4]) print("series1:\n{}\n".format(series1)) # series1: # 0 1 # 1 2 # 2 3 # 3 4 # dtype: int64
- 输出的最后一行是Series中数据的类型,这里的数据都是int64类型的。
- 数据在第二列输出,第一列是数据的索引
我们分别打印出Series中的数据和索引
print("series1.values: {}\n".format(series1.values)) print("series1.index: {}\n".format(series1.index)) # series1.values: [1 2 3 4] # series1.index: RangeIndex(start=0, stop=4, step=1)
我们可以指定索引的类型,例如字符串
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"])) # series2: # C 1 # D 2 # E 3 # F 4 # G 5 # A 6 # B 7 # dtype: int64 # E is 3
DataFrame
通过Numpy接口来创建一个4x4的矩阵,以此来创建DataFrame
1 import pandas as pd 2 import numpy as np 3 4 df1 = pd.DataFrame(np.arange(16).reshape(4,4)) 5 print("df1:\n{}\n".format(df1)) 6 7 # df1: 8 # 0 1 2 3 9 # 0 0 1 2 3 10 # 1 4 5 6 7 11 # 2 8 9 10 11 12 # 3 12 13 14 15
默认的索引和列名都是[0,N-1]的形式,同样我们可以指定列名和索引,
1 import pandas as pd 2 import numpy as np 3 4 df2 = pd.DataFrame(np.arange(16).reshape(4,4), 5 columns=["column1", "column2", "column3", "column4"], 6 index=["a", "b", "c", "d"]) 7 print("df2:\n{}\n".format(df2)) 8 9 # df2: 10 # column1 column2 column3 column4 11 # a 0 1 2 3 12 # b 4 5 6 7 13 # c 8 9 10 11 14 # d 12 13 14 15
我们也可以指定结构来创建DataFrame
1 import pandas as pd 2 import numpy as np 3 4 df3 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"], 5 "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]}) 6 print("df3:\n{}\n".format(df3)) 7 8 # df3: 9 # note weekday 10 # 0 C Mon 11 # 1 D Tue 12 # 2 E Wed 13 # 3 F Thu 14 # 4 G Fri 15 # 5 A Sat 16 # 6 B Sun
注意:
-
DataFrame的不同列可以是不同的数据类型
-
如果以Series数组来创建DataFrame,每个Series将成为一行,而不是一列
1 import pandas as pd 2 import numpy as np 3 4 noteSeries = pd.Series(["C", "D", "E", "F", "G", "A", "B"], 5 index=[1, 2, 3, 4, 5, 6, 7]) 6 weekdaySeries = pd.Series(["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"], 7 index=[1, 2, 3, 4, 5, 6, 7]) 8 df4 = pd.DataFrame([noteSeries, weekdaySeries]) 9 print("df4:\n{}\n".format(df4)) 10 11 # df4: 12 # 1 2 3 4 5 6 7 13 # 0 C D E F G A B 14 # 1 Mon Tue Wed Thu Fri Sat Sun
我们还可以“添加”或“删除”列数据
1 import pandas as pd 2 import numpy as np 3 4 df3 = pd.DataFrame({"note" : ["C", "D", "E", "F", "G", "A", "B"], 5 "weekday": ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]}) 6 df3["No."] = pd.Series([1, 2, 3, 4, 5, 6, 7]) 7 print("df3:\n{}\n".format(df3)) 8 9 del df3["weekday"] 10 print("df3:\n{}\n".format(df3)) 11 12 # df3: 13 # note weekday No. 14 # 0 C Mon 1 15 # 1 D Tue 2 16 # 2 E Wed 3 17 # 3 F Thu 4 18 # 4 G Fri 5 19 # 5 A Sat 6 20 # 6 B Sun 7 21 22 # df3: 23 # note No. 24 # 0 C 1 25 # 1 D 2 26 # 2 E 3 27 # 3 F 4 28 # 4 G 5 29 # 5 A 6 30 # 6 B 7
index对象与数据访问
同样可以通过索引来获取DataFrame的行和列
1 print("df3.columns\n{}\n".format(df3.columns)) 2 print("df3.index\n{}\n".format(df3.index)) 3 4 # df3.columns 5 # Index(['note', 'No.'], dtype='object') 6 7 # df3.index 8 # RangeIndex(start=0, stop=7, step=1)
注意:
-
Index并非集合,因此其中可以包含重复的数据
-
Index对象的值是不可以改变,因此可以通过它安全的访问数据
DataFrane提供了下面两个操作符来访问其中的数据
-
loc
:通过行和列的索引来访问数据 -
iloc
:通过行和列的下标来访问数据
1 print("Note C, D is:\n{}\n".format(df3.loc[[0, 1], "note"])) 2 print("Note C, D is:\n{}\n".format(df3.iloc[[0, 1], 0])) 3 4 # Note C, D is: 5 # 0 C 6 # 1 D 7 # Name: note, dtype: object 8 9 # Note C, D is: 10 # 0 C 11 # 1 D 12 # Name: note, dtype: object
第一行代码访问了行索引为0和1,列索引为“note”的元素,第二行代码访问了行下标为0和1对于df3来说,行索引和行下标刚好是一样的,所以这里都是0和1,但它们却是不同的含义),列下标为0的元素。
文件操作
读取Excel文件
注:要读取Excel文件,还需要安装另外一个库;xlrd
pip install xlrd
1 import pandas as pd 2 import numpy as np 3 4 df1 = pd.read_excel("data/test.xlsx") 5 print("df1:\n{}\n".format(df1)) 6 7 # df1: 8 # C Mon 9 # 0 D Tue 10 # 1 E Wed 11 # 2 F Thu 12 # 3 G Fri 13 # 4 A Sat 14 # 5 B Sun
读取csv文件
1 import pandas as pd 2 import numpy as np 3 # CSV文件内容如下 4 # C,Mon 5 # D,Tue 6 # E,Wed 7 # F,Thu 8 # G,Fri 9 # A,Sat 10 df2 = pd.read_csv("data/test1.csv") 11 print("df2:\n{}\n".format(df2)) 12 13 # C|Mon 14 # D|Tue 15 # E|Wed 16 # F|Thu 17 # G|Fri 18 # A|Sat