(三)Pandas基础操作

 

1. 基本数据结构

Pandas最基础的数据结构是Series,用它来表达一行数据,可以理解为一维的数组。

import pandas as pd

s = pd.Series([4, 2, 5, 0, 6, 3])

s
Out[76]: 
0    4
1    2
2    5
3    0
4    6
5    3
dtype: int64

另外一个关键的数据结构为DataFrame,它表示的是二维数组。

df = pd.DataFrame(np.random.randint(1, 5, (3, 4)), columns=list('ABCD'))

df
Out[81]: 
   A  B  C  D
0  1  3  4  4
1  3  1  3  3
2  1  3  2  4

DataFrame里的数据实际是用Numpyarray对象来保存的,输入df.values可以查看原始数据。DataFrame对象的每一行和列都是一个Series对象。我们可以使用行索引来访问一行数据,可以用列名称来索引一列数据。

df.values
Out[86]: 
array([[1, 3, 4, 4],
       [3, 1, 3, 3],
       [1, 3, 2, 4]])

df.iloc[0]
Out[82]: 
A    1
B    3
C    4
D    4
Name: 0, dtype: int32


df.A
Out[84]: 
0    1
1    3
2    1
Name: A, dtype: int32

Pandas提供了简洁的数据访问功能。DataFrame.shape可以查看数据的维度信息:

df.shape
Out[87]: (3, 4)

通过DataFrame.head()和DataFrame.tail()方法可以访问前n行和后n行的数据:

df.head(3)
Out[88]: 
   A  B  C  D
0  1  3  4  4
1  3  1  3  3
2  1  3  2  4

df.tail(2)
Out[89]: 
   A  B  C  D
1  3  1  3  3
2  1  3  2  4

通过DataFrame.indexDataFrame.columns属性,可以访问数据的行索引和列索引信息。

df.index
Out[90]: RangeIndex(start=0, stop=3, step=1)

df.columns
Out[91]: Index(['A', 'B', 'C', 'D'], dtype='object')

通过DataFrame.describe()方法,可以算出每列的元素个数、平均值、标准差、最小值、 最大值及几种分位数的值。

df.describe()
Out[92]: 
              A         B    C         D
count  3.000000  3.000000  3.0  3.000000
mean   1.666667  2.333333  3.0  3.666667
std    1.154701  1.154701  1.0  0.577350
min    1.000000  1.000000  2.0  3.000000
25%    1.000000  2.000000  2.5  3.500000
50%    1.000000  3.000000  3.0  4.000000
75%    2.000000  3.000000  3.5  4.000000
max    3.000000  3.000000  4.0  4.000000

2. 数据排序

通过DataFrame.sort_index()函数可以方便地对索引进行排序。

df.sort_index(axis=0, ascending=False) #行逆序,ascending=False指定逆序,默认为顺序
Out[93]: 
   A  B  C  D
2  1  3  2  4
1  3  1  3  3
0  1  3  4  4

df.sort_index(axis=1, ascending=False) #列逆序
Out[94]: 
   D  C  B  A
0  4  4  3  1
1  3  3  1  3
2  4  2  3  1

也可以通过DataFrame.sort_values()对数值进行排序。

df.sort_values(by='B')  #根据B列排序,默认从小到大
Out[95]: 
   A  B  C  D
1  3  1  3  3
0  1  3  4  4
2  1  3  2  4

df.sort_values(by='B',ascending=False)  #根据B列逆序排序
Out[96]: 
   A  B  C  D
0  1  3  4  4
2  1  3  2  4
1  3  1  3  3

3. 数据访问

Pandas可以方便地对数据进行选择和访问。我们可以通过行索引范围来访问特定几行的数据,这个和Numpy类似。

df[2:3]
Out[97]: 
   A  B  C  D
2  1  3  2  4
还可以选择列,如选择 A B D 3 列数据:
df[['A', 'B', 'D']]
Out[98]: 
   A  B  D
0  1  3  4
1  3  1  3
2  1  3  4

还可以使用DataFrame.loc()函数通过标签来选择某个元素,或使用DataFrame.iloc()函数通过数组索引来访问某个元素。

df.loc[2, 'A']
Out[100]: 1

df.iloc[2, 0]
Out[101]: 1

df.iloc[1:2, 0:2]
Out[102]: 
   A  B
1  3  1

还可以通过布尔值来选择,如可以选择C列里所有大于0的数据所在的行。

df[df.C > 2]
Out[105]: 
   A  B  C  D
0  1  3  4  4
1  3  1  3  3

可以很方便地对数据进行修改,如可以添加一列,列名为TAG

df["TAG"] = ["cat", "dog", "cat"]

df
Out[107]: 
   A  B  C  D  TAG
0  1  3  4  4  cat
1  3  1  3  3  dog
2  1  3  2  4  cat

接着可以根据TAG列做分组聚合统计。

df.groupby('TAG').sum()
Out[108]: 
     A  B  C  D
TAG            
cat  2  6  6  8
dog  3  1  3  3

4. 文件输入/输出

 
#读取csv
pd.read_csv('file.csv', header=None, nrows=5)
#写入csv
df.to_csv('myDataFrame.csv')

#读取Excel
pd.read_excel('file.xlsx')
#写入Excel
pd.to_excel('dir/myDataFrame.xlsx', sheet_name='Sheet1')

#读取内含多个表的Excel 
xlsx = pd.ExcelFile('file.xls')
df = pd.read_excel(xlsx, 'Sheet1')

5. 数据表连接

Pandas库还提供了一些高级功能,其中的数据合并与重塑为两个数据表的拼接提供了极大的便利,主要涉及merge()、concat()等函数,下面通过一个例子进行简单介绍。假设创建了如下两个DataFrame数据表,需要将它们连接在一起。

df1 = pd.DataFrame({'X1': ['A', 'B', 'C'], 'X2': [1, 2, 3]})
df2 = pd.DataFrame({'X1': ['A', 'B', 'D'], 'X2': [4, 5, 6]})

df1
Out[111]: 
  X1  X2
0  A   1
1  B   2
2  C   3

df2
Out[112]: 
  X1  X2
0  A   4
1  B   5
2  D   6
pd.merge(df1, df2, how='left', on='X1')  #左连接
Out[113]: 
  X1  X2_x  X2_y
0  A     1   4.0
1  B     2   5.0
2  C     3   NaN

pd.merge(df1, df2, how='right', on='X1') #右连接
Out[114]: 
  X1  X2_x  X2_y
0  A   1.0     4
1  B   2.0     5
2  D   NaN     6

pd.merge(df1, df2, how='inner', on='X1') #内连接
Out[115]: 
  X1  X2_x  X2_y
0  A     1     4
1  B     2     5

pd.merge(df1, df2, how='outer', on='X1') #外连接
Out[116]: 
  X1  X2_x  X2_y
0  A   1.0   4.0
1  B   2.0   5.0
2  C   3.0   NaN
3  D   NaN   6.0

concat()函数是一种全连接(UNION ALL)方式,它不需要对齐,而是直接进行合并,即不需要两个表的某些列或索引相同,只是把数据整合到一起。因此,该函数没有how和on参数,而是通过axis参数指定连接的轴向,该参数默认为0,按行方向连接,即纵向拼接。

pd.concat([df1, df2], axis=0)
Out[118]: 
  X1  X2
0  A   1
1  B   2
2  C   3
0  A   4
1  B   5
2  D   6

pd.concat([df1, df2], axis=1)
Out[119]: 
  X1  X2 X1  X2
0  A   1  A   4
1  B   2  B   5
2  C   3  D   6

#拼接后的行索引为原来两个表各自的索引,若要重置索引,可以在concat()函数中设置ignore_index=True,忽略原有索引,生成新的数字序列作为索引。

pd.concat([df1, df2], axis=0,ignore_index=True)
Out[121]: 
  X1  X2
0  A   1
1  B   2
2  C   3
3  A   4
4  B   5
5  D   6

pd.concat([df1, df2], axis=1,ignore_index=True)
Out[120]: 
   0  1  2  3
0  A  1  A  4
1  B  2  B  5
2  C  3  D  6

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风影楼前

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值