本文详细介绍Pandas数据结构DataFrame和Series的常用方法。
首发于本人公众号:pythonic生物人
更好的阅读体验请戳:
本文可以学到什么?
1、pandas简介
2、pandas数据结构之-Series
pandas.Series快速创建
pandas.Series取出所有值:values
pandas.Series取出索引:index
pandas.Series类似于numpy.ndarry的性能
pandas.Series通过索引值取值
pandas.Series类似字典(dict)的性能
3、pandas数据结构之-DataFrame
DataFame创建
pandas.DataFrame中取列操作
pandas.DataFrame中取某一列
pandas.DataFrame中取某几列-方法1
pandas.DataFrame中取某几列-方法2
pandas.DataFrame中取行操作
pandas.DataFrame中取某一行
pandas.DataFrame中取某几行
pandas.DataFrame中按一个条件过滤行
pandas.DataFrame中按多个条件过滤行
pandas.DataFrame中结合map 和lambda函数过滤行
pandas.DataFrame中结合isin过滤行
pandas.DataFrame中取某几行中的某几列
pandas.DataFrame中替换值:where方法
pandas.DataFrame中查找某个位置的值:lookup方法
pandas.DataFrame中末尾新增加列
pandas.DataFrame中指定位置新增加列:insert方法
pandas.DataFrame中删除列:del方法
pandas.DataFrame复制:copy方法
pandas.DataFrame查看前几行和末尾几行:head|tail
Series、pandas.DataFrame中某列唯一值的个数:unique
pandas.DataFrame统计列中每个元素出现的频次:value_counts方法
pandas.DataFrame按照某几列分组并统计:groupby+count
pandas.DataFrame按照某列分组并求和
pandas.DataFrame按照某列分组并取出某个小组:groupby+get_group
pandas.DataFrame排序
pandas.DataFrame按照行标签或者列标签排序:sort_index方法
pandas.DataFrame按照某列值排序:sort_values方法by参数
pandas.DataFrame描述统计
pandas.DataFrame获取行列标签/表头名称
1、pandas简介
- pandas模块是在numpy的基础上构建的,速度快(层算法都用 Cython优化过)、有大量直接操作每个元素的函数;
- 常常和Matplotlib,seaborn,statsmodels,scikit-learn等包一起使用;
- 相比于numpy,pandas更擅长处理表格型(Tabular data)数据,表格中每列数据类型可以不一致,numpy数组规定数据类型需要一致;
- 主要有两种数据结构:一维Series(类似numpy.ndarray)带行标签,二维DataFrame(比R中data.frame更丰富),同时带行标签和列标签;
- 关于pandas的使用可以在这里搜索,点击戳:https://pandas.pydata.org/pandas-docs/stable/reference/index.html 。
- python社区默认将pandas模块简写为pd,导入模块的时候要一起导入pandas的两种数据结构:Series和DataFrame:
In [8]: import pandas as pd
In [9]: from pandas import Series,DataFrame#导入两种数据结构。
2、pandas数据结构1-Series
- Series是一个自带标签的一维数组( one-dimensional labeled array),结构图如下:
- Series具有大量属性和函数:
In [27]: len(dir(Series))
Out[27]: 471#方法多大400多种,详细使用如下:
pandas.Series快速创建
语法:
pd.Series(data=None, index=None, dtype=None, name=None, copy=False, fastpath=False)
data:python中的字典、可迭代对象、numpy.ndarry或者标量值
index:可选项,默认为列表[0, ..., len(data) - 1],可以自己传入
dtype:可选项,设置数据类型
In [38]: data = pd.Series([1,2,3,4,5])#不指定索引值,默认索引值为[0, ..., len(data) - 1]
In [39]: data
Out[39]:
0 1
1 2
2 3
3 4
4 5
dtype: int64
#pandas.Series自定义索引值
In [47]: data1 = pd.Series([1,2,3,4,5],index=list('abcde'))
In [48]: data1
Out[48]:
a 1
b 2
c 3
d 4
e 5
dtype: int64
pandas.Series取出所有值:values
返回一个数组。
In [49]: data1.values
Out[49]: array([1, 2, 3, 4, 5], dtype=int64)
pandas.Series取出索引:index
返回一个数组
In [50]: data1.index
Out[50]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
pandas.Series类似于numpy.ndarry的性能
属性查看:数据类型(dtype)、形状(shape)、维度(ndim)、元素个数(size)、索引、切片、布尔过滤等。
pandas.Series通过索引值取值
In [58]: data1['a']#取单个值,类似于字典中通过键取值
Out[58]: 1
In [10]: data1[['a','b']]#传入索引值列表取一组值
Out[10]:
a 1
b 2
dtype: int64
等价于
In [14]: data1[0]
Out[14]: 1
In [15]: data1[[0,1]]
Out[15]:
a 1
b 2
dtype: int64
pandas.Series类似字典(dict)的性能
In [18]: 'a' in data1#判断pandas.Series索引值成员资格
Out[18]: True
In [17]: 1 in data1.values#判断pandas.Series元素成员资格
Out[17]: True
In [20]: data1['a'] = '1234'#修改pandas.Series元素值
In [21]: data1
Out[21]:
a 1234
b 2
c 3
d 4
e 5
dtype: int64
3、pandas数据结构2-DataFrame
- DataFrame结构如下图,可以理解为一个具有行索引和列索引的表格性结构;
- 每一列都是一个Series对象、每一列的数据类型可以不一样;
- 具有大量属性和函数:详细使用请戳这里额
DataFame创建
- 语法:pandas.DataFrame(data=None, index: Optional[Collection] = None, columns: Optional[Collection] = None, dtype: Union[str, numpy.dtype, ExtensionDtype, None] = None, copy: bool = False)
- data
- index:可选项,行标签
- columns:可选项,列标签
- dtype:可选项,元素数据类型
创建方式很多,罗列两种:
#使用字典创建pandas.DataFame
In [40]: d = {'col1': [1, 2], 'col2': [3, 4]}
...: df = pd.DataFrame(d,dtype=np.int8)#dtype指定元素数据类型
In [41]: df
Out[41]:
col1 col2
0 1 3
1 2 4
In [42]: df.dtypes#查看数据类型
Out[42]:
col1 int8
col2 int8
dtype: object
In [29]: df
Out[29]:
col1 col2
0 1 3
1 2 4
#使用二维numpy.ndarry创建pandas.DataFame
In [43]: df2 = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
...: columns=['a', 'b', 'c'])# columns指定列标签
In [44]: df2
Out[44]:
a b c
0 1 2 3
1 4 5 6
2 7 8 9
pandas.DataFrame中取列操作
image#创建实验DataFrame
In [140]: d = {'one': pd.Series([2., 2., 3.,4.], index=['a', 'b', 'c','d']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd']),'three': pd.Series([3., 1., 3., 4.], index=['a', 'b', 'c', 'd'])}
In [141]: df = pd.DataFrame(d)
In [142]: df
Out[142]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
-
pandas.DataFrame中取某一列
In [143]: df['one']
Out[143]:
a 2.0
b 2.0
c 3.0
d 4.0
Name: one, dtype: float64
-
pandas.DataFrame中取某几列-方法1
In [144]: df[['one','three']]#[[]],中括号中放入一个1索引值列表
Out[144]:
one three
a 2.0 3.0
b 2.0 1.0
c 3.0 3.0
d 4.0 4.0
-
pandas.DataFrame中取某几列-方法2
In [76]: df.iloc[:,[0,2]]#df.iloc[行索引, [列索引号]]
Out[76]:
one three
a 2.0 3.0
b 2.0 1.0
c 3.0 3.0
d 4.0 4.0
pandas.DataFrame中取行操作
image-
pandas.DataFrame中取某一行
In [94]: df
Out[94]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [95]: df.loc[['a']]
Out[95]:
one two three
a 2.0 1.0 3.0
In [106]: type(df.loc[['a']])#返回一个DataFrame对象
Out[106]: pandas.core.frame.DataFrame
In [96]: df.loc['a']#使用['a']和[['a']]呈现方式有区别
Out[96]:
one 2.0
two 1.0
three 3.0
In [105]: type(df.loc['a'])#返回一个Series对象
Out[105]: pandas.core.series.Series
-
pandas.DataFrame中取某几行
In [97]: df.loc[['a','d']]
Out[97]:
one two three
a 2.0 1.0 3.0
d 4.0 4.0 4.0
-
pandas.DataFrame中按一个条件过滤行
此时传入布尔向量辅助过滤。
In [118]: df
Out[118]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [114]: df['two']#取出'two'列
Out[114]:
a 1.0
b 2.0
c 3.0
d 4.0
Name: two, dtype: float64
In [115]: df['two'] > 2#'two'列判断返回布尔型Series对象
Out[115]:
a False
b False
c True
d True
Name: two, dtype: bool
In [116]: df[df['two'] > 2]#取出'two'列中元素值大于2的行
Out[116]:
one two three
c 3.0 3.0 3.0
d 4.0 4.0 4.0
-
pandas.DataFrame中按多个条件过滤行
此时会用到逻辑运算符:
| 或者& 且~ 取反
注意使用括号将每个条件括起来,如下:
In [125]: df[(df['two'] >= 2) & (df['three'] >= 3)]#取'two'列大于等于2且'three'列大于等于3的行
Out[125]:
one two three
c 3.0 3.0 3.0
d 4.0 4.0 4.0
-
pandas.DataFrame中结合map 和lambda函数过滤行
In [136]: df
Out[136]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [137]: fileter_ = df['one'].map(lambda x: str(x).startswith('2'))#取出'one'列中以2开头的字符
In [138]: df[fileter_]
Out[138]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
-
pandas.DataFrame中结合isin过滤行
In [139]: df
Out[139]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [140]: df['one'].isin([1,2])#取出'one'列中值为1或者2的行
Out[140]:
a True
b True
c False
d False
Name: one, dtype: bool
In [141]: df[df['one'].isin([1,2])]
Out[141]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
-
pandas.DataFrame中取某几行中的某几列
In [101]: df
Out[101]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [102]: df.iloc[[0,3],[0,1]]#取第0行,3行的第1列和第2列
Out[102]:
one two
a 2.0 1.0
d 4.0 4.0
pandas.DataFrame中替换值:where方法
where对不满足条件的元素执行操作,不会改变原数据。
In [151]: df
Out[151]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [152]: df.where(df['one'] < 3, df-1)#对于'one'列元素大于等于3的行(c和d行)执行减1操作
Out[152]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 2.0 2.0 2.0
d 3.0 3.0 3.0
pandas.DataFrame中查找某个位置的值:lookup方法
(个人感觉没什么卵用)
In [166]: df
Out[166]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [167]: df.lookup(['d','a'],['one','three'])#查找坐标为('d','one')和('a','three')的值
Out[167]: array([4., 3.])
In [168]: df.lookup(['a','d'],['one','three'])
Out[168]: array([2., 4.])
pandas.DataFrame中末尾新增加列
会直接修改原始数据,慎重使用。
In [169]: df1
Out[169]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [170]: df1['five'] = -df1['three']#默认在末尾添加以列
In [171]: df1
Out[171]:
one two three five
a 2.0 1.0 3.0 -3.0
b 2.0 2.0 1.0 -1.0
c 3.0 3.0 3.0 -3.0
d 4.0 4.0 4.0 -4.0
pandas.DataFrame中指定位置新增加列:insert方法
In [186]: df.insert(1, 'new_one', df['one'])#在第一列后新增加列
In [187]: df
Out[187]:
one new_one two three
a 2.0 2.0 1.0 3.0
b 2.0 2.0 2.0 1.0
c 3.0 3.0 3.0 3.0
d 4.0 4.0 4.0 4.0
pandas.DataFrame中删除列:del方法
会直接修改原始数据,慎重使用。
In [177]: del df1['five']
In [178]: df1
Out[178]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
pandas.DataFrame复制:copy方法
可以避免del,insert这种方法直接修改原始数据。
In [189]: df1 = df.copy()
In [190]: df1
Out[190]:
one new_one two three
a 2.0 2.0 1.0 3.0
b 2.0 2.0 2.0 1.0
c 3.0 3.0 3.0 3.0
d 4.0 4.0 4.0 4.0
In [192]: del df1['new_one']
In [193]: df1#df1被修改
Out[193]:
one two three
a 2.0 1.0 3.0
b 2.0 2.0 1.0
c 3.0 3.0 3.0
d 4.0 4.0 4.0
In [194]: df#df未被修改
Out[194]:
one new_one two three
a 2.0 2.0 1.0 3.0
b 2.0 2.0 2.0 1.0
c 3.0 3.0 3.0 3.0
d 4.0 4.0 4.0 4.0
pandas.DataFrame查看前几行和末尾几行:head|tail
In [199]: df
Out[199]:
one new_one two three
a 2.0 2.0 1.0 3.0
b 2.0 2.0 2.0 1.0
c 3.0 3.0 3.0 3.0
d 4.0 4.0 4.0 4.0
In [200]: df.head(3)#查看前三行
Out[200]:
one new_one two three
a 2.0 2.0 1.0 3.0
b 2.0 2.0 2.0 1.0
c 3.0 3.0 3.0 3.0
In [201]: df.tail(3)#查看末尾三行
Out[201]:
one new_one two three
b 2.0 2.0 2.0 1.0
c 3.0 3.0 3.0 3.0
d 4.0 4.0 4.0 4.0
Series、pandas.DataFrame中某列唯一值的个数:unique
In [68]: pd.Series(['c', 'a', 'd', 'a', 'a', 'b', 'b', 'c' , 'c']).unique()
Out[68]: array(['c', 'a', 'd', 'b'], dtype=object)
pandas.DataFrame统计列中每个元素出现的频次:value_counts方法
In [251]: df1
Out[251]:
one two
a 1.0 1.0
b 2.0 2.0
c 3.0 NaN
d NaN 4.0
In [252]: df1['one'].value_counts()
Out[252]:
3.0 1
2.0 1
1.0 1
Name: one, dtype: int64
In [253]: df1['one'].value_counts(dropna=False)#不跳过缺省值
...:
Out[253]:
NaN 1
3.0 1
2.0 1
1.0 1
Name: one, dtype: int64
pandas.DataFrame按照某几列分组并统计:groupby+count
In [5]: df = pd.DataFrame([('bird', 'Falconiformes', 389.0),
...: ('bird', 'Psittaciformes', 24.0),
...: ('mammal', 'Carnivora', 80.2),
...: ('mammal', 'Primates', np.nan),
...: ('mammal', 'Carnivora', 58)],
...: index=['falcon', 'parrot', 'lion', 'monkey', 'leopard'],
...: columns=('class', 'order', 'max_speed'))
In [6]: df
Out[6]:
class order max_speed
falcon bird Falconiformes 389.0
parrot bird Psittaciformes 24.0
lion mammal Carnivora 80.2
monkey mammal Primates NaN
leopard mammal Carnivora 58.0
In [7]: df.groupby(['class','order']).count()
Out[7]:
max_speed
class order
bird Falconiformes 1
Psittaciformes 1
mammal Carnivora 2
Primates 0
pandas.DataFrame按照某列分组并求和:
In [17]: df2 = pd.DataFrame({'X': ['B', 'B', 'A', 'A'], 'Y': [1, 2, 3, 4]})
In [18]: df2
Out[18]:
X Y
0 B 1
1 B 2
2 A 3
3 A 4
In [19]: df2.groupby(['X']).sum()
Out[19]:
Y
X
A 7
B 3
In [20]: df2.groupby(['X'],sort=False).sum()
Out[20]:
Y
X
B 3
A 7
pandas.DataFrame按照某列分组并取出某个小组:groupby+get_group
In [27]: df2.groupby(['X']).get_group('A')
Out[27]:
X Y
2 A 3
3 A 4
#统计groupby分组的组数
In [28]: len(df2.groupby(['X'],sort=False).get_group('A'))
Out[28]: 2
pandas.DataFrame排序
-
pandas.DataFrame按照行标签或者列标签排序:sort_index方法
默认为升序,ascending可设置排序方式。
In [31]: frame = pd.DataFrame(np.arange(8).reshape((2, 4)), index=['three', 'one'], columns=['d', 'a', 'b', 'c'])
In [32]: frame
Out[32]:
d a b c
three 0 1 2 3
one 4 5 6 7
In [36]: frame
Out[36]:
d a b c
three 0 1 2 3
one 4 5 6 7
In [37]: frame.sort_index()#行索引排序
Out[37]:
d a b c
one 4 5 6 7
three 0 1 2 3
In [38]: frame.sort_index(axis=1)#列索引排序
Out[38]:
a b c d
three 1 2 3 0
one 5 6 7 4
In [39]: frame.sort_index(axis=1, ascending=False)#列索引排序,ascending设置升序还是降序排序
Out[39]:
d c b a
three 0 3 2 1
one 4 7 6 5
-
pandas.DataFrame按照某列值排序:sort_values方法by参数
In [41]: frame.sort_values(by='d')#按照d列值排序,默认是升序
Out[41]:
d a b c
three 0 1 2 3
one 4 5 6 7
In [42]: frame.sort_values(by='d',ascending=False)#ascending设置降序排序
Out[42]:
d a b c
one 4 5 6 7
three 0 1 2 3
In [43]: frame.sort_values(by=['c','d'],ascending=False)#按照c,d的值排序,即先按c列值排序,c列值相同时再按d列值排序
Out[43]:
d a b c
one 4 5 6 7
three 0 1 2 3
pandas.DataFrame描述统计
Pandas中描述和汇总统计常用函数
方法 说明
count 非 NA 值的数量
describe 针对 Series 或 DataFrame 的列计算汇总统计,对于数值和字符返回结构不一样
min , max 最小值和最大值
argmin , argmax 最小值和最大值的索引位置(整数)
idxmin , idxmax 最小值和最大值的索引值
quantile 样本分位数(0 到 1)
sum 求和
mean 均值
median 中位数
mad 根据均值计算平均绝对离差
var 方差
std 标准差
skew 样本值的偏度(三阶矩)
kurt 样本值的峰度(四阶矩)
cumsum 样本值的累计和
cummin , cummax 样本值的累计最大值和累计最小值
cumprod 样本值的累计积
diff 计算一阶差分(对时间序列很有用)
pct_change 计算百分数变化
In [44]: df = DataFrame([[1.4,np.nan],[7.1,-4.5],[np.nan,np.nan],[0.75,-1.3]],index=['a','b','c','d'],columns=['one','two'])
In [45]: df
Out[45]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [46]: df.sum()#默认求每列的和
Out[46]:
one 9.25
two -5.80
dtype: float64
In [47]: df.sum(axis = 1)#传入参数axis,求每行的和
Out[47]:
a 1.40
b 2.60
c 0.00
d -0.55
dtype: float64
In [48]: df.describe()#输出每列值的多个统计指标,对于NaN值直接跳过
Out[48]:
one two
count 3.000000 2.000000
mean 3.083333 -2.900000
std 3.493685 2.262742
min 0.750000 -4.500000
25% 1.075000 -3.700000
50% 1.400000 -2.900000
75% 4.250000 -2.100000
max 7.100000 -1.300000
In [53]: pd.Series(['a', 'a', 'b', 'c']).describe()
Out[53]:
count 4
unique 3#字符去重后的个数
top a
freq 2
dtype: object
pandas.DataFrame获取行列标签/表头名称
In [75]: df
Out[75]:
one two
a 1.40 NaN
b 7.10 -4.5
c NaN NaN
d 0.75 -1.3
In [76]: list(df.columns.values)#列标签
Out[76]: ['one', 'two']
In [77]: list(df.index.values)#行标签
Out[77]: ['a', 'b', 'c', 'd']
参考资料
https://pandas.pydata.org/pandas-docs/stable/index.html
[Python for Data Analysis, 2nd Edition]
(https://pandas.pydata.org/pandas-docs/stable/index.html)
Python数据科学手册
欢迎关注公众号:pythonic生物人
干货,真香
网友评论