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里的数据实际是用Numpy的array对象来保存的,输入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.index和DataFrame.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
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
210

被折叠的 条评论
为什么被折叠?



