pandas小结(二)基础
pandas是Python中开源的,高性能的用于数据分析的库。其中包含了很多可用的数据结构及功能,各种结构支持相互转换,并且支持读取、保存数据。结合matplotlib库,可以将数据已图表的形式可视化,反映出数据的各项特征。pandas的一些基本使用方法,具体可以参数下图(后面会再单独说明):
一、pandas的数据结构
pandas的安装比较简单,直接pip install pandas 就可以了。我们直接从数据结构开始。pandas分Seris 一维数据和DataFrame二维数据。
1.Seris
Seris是一维的,带索引的数组,支持多种数据类型。可以使用列表进行转换:
import pandas as pd s = pd.Series([3, -5, 7, 4], index=['a', 'b', 'c', 'd']) print(s)
输出结果如下:
a 3 b -5 c 7 d 4 dtype: int64
也可以重新指定索引:
s.index = ['A', 'B', 'C', 'D'] print(s)
2.DataFrame
一种二维的,类似于Excel表格的数据结构,可以为其指定列名、索引名。将字典结构转换为DataFrame:
data = { 'Country': ['Belgium', 'India', 'Brazil'], 'Capital': ['Brussels', 'New Delhi', 'Brasília'], 'Population': [11190846, 1303171035, 207847528] } df = pd.DataFrame(data, columns=['Country', 'Capital', 'Population']) print(df) #执行后输出结果如下 Country Capital Population 0 Belgium Brussels 11190846 1 India New Delhi 1303171035 2 Brazil Brasília 207847528
二、查看DataFrame数据的基本信息
对已一个刚接触的数据集,最好的了解它的方式就是先通过一些简单的命令查看他的基本结构,比如有多少行、多少列,列名是什么,是否有索引等等。pandas提供了这样的一系列命令让我们能够轻松的进行查询。
# 查看行列信息(几行,几列) print(df.shape) #查看列名及索引名 print(df.columns) print(df.index) #查看DataFrame的描述信息 print(df.info()) #查看头尾几行 print(df.head()) print(df.tail())
df.info()显示的信息较全面,对索引、列、数据类型都做出了描述。df.head和df.tail默认只显示五行的数据。
三、DataFrame子集的选择
1、根据列名选择:
selected_cols = ['Country', 'Capital'] new_df = df[selected_cols] print(new_df) #执行结果如下 Country Capital 0 Belgium Brussels 1 India New Delhi 2 Brazil Brasília
2、根据标签选择
使用loc[]方法通过指定列名、索引名来获得相应的数据集。以我上面使用的df数据为例,取第3行的'Country'列的数据:
print(df.loc[2, 'Country']) 执行结果: Brazil
3、根据位置选择
使用iloc[]通过指定列名、索引名对应的索引位置(从0到n-1)获取数据(可以使用slice分片方式表示)。如果我想取前2行中最后2列的数据,应该这样表示:
print(df.iloc[:2, -2:]) #执行结果如下: Capital Population 0 Brussels 11190846 1 New Delhi 1303171035
4、布尔索引(Boolean Indexing)
也叫做布尔掩码(Boolean mask),是指先根据条件对DataFrame进行运算,生成一个值为True/False的DataFrame,再通过此DF与原DF进行匹配,得到符合条件的DF,不符合条件的显示为NaN:
mask = df > 207847527 print(df[mask].head()) # 输出结果如下: Country Capital Population 0 Belgium Brussels NaN 1 India New Delhi 1.303171e+09 2 Brazil Brasília 2.078475e+08
对于上面的一维Seris 也可以用,如下:
mask = s > 3.5 print(s[mask]) #输出结果如下 C 7 D 4 dtype: int64
关于布尔索引这部分,也可以对单列进行操作,我们再看个示例,先生成测试数据:
import numpy as np import pandas as pd df = pd.DataFrame(np.random.randint(100, size=(5, 5)), columns = list("ABCDE"), index = ["R" + str(i) for i in range(5)]) print(df) #输出结果如下 A B C D E R0 28 98 64 94 67 R1 39 69 59 39 75 R2 4 95 41 34 28 R3 68 92 99 63 55 R4 12 99 0 7 92
指定单列进行判断:
mask = df['A'] > 10 print (mask) #输出结果 R0 True R1 True R2 False R3 True R4 True Name: A, dtype: bool
对整个数据进行mask的结果如下:
print(df[mask]) # 输出结果 A B C D E R0 28 98 64 94 67 R1 39 69 59 39 75 R3 68 92 99 63 55 R4 12 99 0 7 92
四、Broadcasting
通过将某一列的值刷成固定的值。例如对一些身高数据做转换时,添加一列'SEX'列,并统一将值更新为'MALE':
heights = [59.0, 65.2, 62.9, 65.4, 63.7] data = { 'height': heights, 'sex': 'Male', } df_heights = pd.DataFrame(data) print(df_heights) #执行结果如下: height sex 0 59.0 Male 1 65.2 Male 2 62.9 Male 3 65.4 Male 4 63.7 Male
五、设置列名及索引名
如果需要重新指定列名或索引名,可直接通过df.columns(),df.index()指定。
df_heights.columns = ['HEIGHT', 'SEX'] df_heights.index = ['david', 'bob', 'lily', 'sara', 'tim'] print(df_heights) # result HEIGHT SEX david 59.0 Male bob 65.2 Male lily 62.9 Male sara 65.4 Male tim 63.7 Male
六、使用聚合函数
如果需要对数据进行一些统计,可使用聚合函数进行计算。
1、df.sum()
将所有值按列加到一起,字符串sum后会合并在一起:
print(df_heights.sum()) # result HEIGHT 316.2 SEX MaleMaleMaleMaleMale dtype: object
2、df.cumsum()
统计累积加和值:
print(df_heights.cumsum()) # result HEIGHT SEX david 59 Male bob 124.2 MaleMale lily 187.1 MaleMaleMale sara 252.5 MaleMaleMaleMale tim 316.2 MaleMaleMaleMaleMale
3、df.max() / df.min()
求最大/最小值
print(df_heights.max()) # result HEIGHT 65.4 SEX Male dtype: object ------------------------------- print(df_heights.min()) # result HEIGHT 59 SEX Male dtype: object
4、df.mean()
求平均数,数据类型为字符串的列会被自动过滤。
print(df_heights.mean()) # result HEIGHT 63.24 dtype: float64
5、df.median()
求中位数
print(df_heights.median()) # result HEIGHT 63.7 dtype: float64
6、df.describe()
获取DF的基本统计信息:
print(df_heights.describe()) # result HEIGHT count 5.000000 mean 63.240000 std 2.589015 min 59.000000 25% 62.900000 50% 63.700000 75% 65.200000 max 65.400000
七、从DataFrame中删除数据
1、通过指定行索引删除行数据
df_heights.drop(['david', 'tim']) print(df_heights) # result HEIGHT SEX david 59.0 Male bob 65.2 Male lily 62.9 Male sara 65.4 Male tim 63.7 Male
我们发现drop'david', 'tim'所在行后,再次打印df_height,之前删除的两行数据还在。说明drop()方法不会直接对原有的DF进行操作,如果需要改变原DF,需要使用inplace='True'参数。
2、通过指定列值删除列数据(需指定axis=1)
print(df_heights.drop('SEX', axis=1)) # result HEIGHT david 177.0 bob 195.6 lily 188.7 sara 196.2 tim 191.1
八、排序与排名
1、根据索引值进行排序
print(df_heights.sort_index()) # result HEIGHT SEX bob 65.2 Male david 59.0 Male lily 62.9 Male sara 65.4 Male tim 63.7 Male
2、根据值进行排序(需指定列名)
print(df_heights.sort_values(by='HEIGHT')) # result HEIGHT SEX david 59.0 Male lily 62.9 Male tim 63.7 Male bob 65.2 Male sara 65.4 Male
3、排名
根据列值进行排名,这点是和排序有区别的,具体看如下结果:
print(df_heights.rank()) # result HEIGHT SEX david 1.0 3.0 bob 4.0 3.0 lily 2.0 3.0 sara 5.0 3.0 tim 3.0 3.0
九、使用lambda函数
对df_heights中的身高列进行转换(inch -> cm)
df_heights = df_heights.apply(lambda height: height*3) print(df_heights) # result HEIGHT SEX david 177.0 MaleMaleMale bob 195.6 MaleMaleMale lily 188.7 MaleMaleMale sara 196.2 MaleMaleMale tim 191.1 MaleMaleMale
You can donate through PayPal.My paypal id: itybku@139.comPaypal page: https://www.paypal.me/361way
近期评论