pandas小结(二)基础

pandas是Python中开源的,高性能的用于数据分析的库。其中包含了很多可用的数据结构及功能,各种结构支持相互转换,并且支持读取、保存数据。结合matplotlib库,可以将数据已图表的形式可视化,反映出数据的各项特征。pandas的一些基本使用方法,具体可以参数下图(后面会再单独说明):

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.com
Paypal page: https://www.paypal.me/361way

  1. 本文目前尚无任何评论.
  1. 本文目前尚无任何 trackbacks 和 pingbacks.