series 和 dataframe 这是pandas 中最为基本的两个概念,series 类似于一维数组,可以近似当成普通的数组进行操作,对于series 默认会有行索引为它索引,但特殊的同时与普通的一维数组不同 列表只能有从0开始的整数索引,而series则可以自定义标签索引,这一点来看,跟字典又比较相似,因此series又可以拥有类似字典的操作方式,series 的标签索引可以随时更新修改替换。series 提供有很多方便的方法,用于判断值为空的 isnull, notnull,sort_index(), sort_values() 用于排序的方法等。
而DataFrame是一种表格型数据结构,它含有一组有序的列,每列可以是不同的值。DataFrame既有行索引,也有列索引,它可以看作是由Series组成的字典,不过这些Series公用一个索引。DataFrame的创建有多种方式,不过最重要的还是根据dict进行创建,以及读取csv或者txt文件来创建。
money_series = pd.Series([200, 300, 10, 5], name="money")
money_series[0] # 根据索引获取具体的值,0对应的依旧是200,等价于 money_series.loc[0]
# 200
money_series.iloc[0] # 根据序号获取具体的值
# 5
注意点: 通过series[x] 索引访问时需要注意自定义的sertes标签索引 和 series默认的position 类型是否一致,当都为int64时,默认的position会被定义的索引覆盖,此时在通过series[x] 访问需要注意不能使用默认的position来访问。
补充:loc 和 iloc 的区别, loc 通过标签(也就是series的索引)访问元素,接受整数索引和非整数索引(因为是标签) iloc 通过整数索引访问元素,并且只能接受整数索引,这一点来看,跟列表的默认整数索引又很相似,允许-1 这样的从后访问元素。
data.loc[:,'列一'] #取出所有行第一列,loc可以理解为传入两个参数一个是关于行的,一个是关于列的。
data.loc[:,['列一','列四','列三']] #取出所有行多列,就把列名包裹成列表的形式。
data.loc[0:5,['列一','列四','列三']] #取出某几行某几列,把行索引和列名传入。
data.loc[data['列四']==138,['列二','列三','列四']] #loc的条件筛选
可以看出行列 的索引访问支持 切片,添加逻辑判断等操作。
语法与loc 看上去比较类似,但功能更为单一
data.iloc[:,1:4] # 返回全部行,索引为1到4的列
data.iloc[3,[1,5]] #返回索引为3的行,索引为1和5的列。
data.iloc[1:8,[1,5]] #取出索引为1到7的行,索引为1和5的列。
data.loc[0:3] #按照名称取数据
data.iloc[0:3] #按照位置取数据
一般访问series 可以有三种方式,一是loc,通过标签索引访问,这种方式只能接受标签作为参数,不能接受其他的参数类型,可以添加过滤条件。 一是通过iloc 索引访问,只能接受整数索引,也不能添加逻辑判断的过滤条件,但它不受标签值的影响可以一直通过整数索引访问,在对series排序后如果想获取首个元素,就可以通过iloc 来访问,因为此时标签的顺序已经改变。 或是直接通过series[] 访问,他同时支持标签访问和整数索引(序号,跟普通列表的默认索引一致),所以在一般情况下通过series[] 访问即可。
切片,取出元素
money_series.loc['c':'a':-1] # 从c取到 a,倒序
"""
c 10
b 300
a 200
Name: money, dtype: int64
"""
上面的访问方式等同于series[‘c’:‘a’:-1] 同理,也支持整数索引(position)进行切片。
取值,根据需要
money_series.iloc[[3, 0]] # 取第四个值和第一个值
"""
d 5
a 200
Name: money, dtype: int64
"""
上面是根据序号进行取值,跟列表的默认索引原理一致即从0开始 同理,对标签索引也支持这样取值。
根据需要进行取值,即自定义条件
money_series[money_series > 50] # 选取大于50的值
"""
c 300
d 200
Name: money, dtype: int64
"""
money_series[lambda x: x ** 2 > 50] # 选取值平方大于50的值
"""
b 10
c 300
d 200
Name: money, dtype: int64
"""
如上,既支持自定义的逻辑判断表达式,也支持lambda表达式。
# 基本的,通过索引获取数据进行修改
s['test'] = 100
s[0] = 1
# 当然也可以通过iloc,at,iat等方式访问元素
# 添加元素
idx = "hello the cruel world".split()
val = range(10, 14)
s = pd.Series(val, index = idx)
# 通过append 方法添加,传入一个新的series 对象即可
s = s.append(pd.Series({"this":9}))
s = s.append(pd.Series({"this":10}))
# 或者通过set_value 方法添加数据,比较append 方法set_value更便捷
s.set_value("this", 8)
# 删除数据
# 一般删除使用不多,更多是数据进行布尔筛选或mask ,提取出符合条件和所需数据即可
t = s[s > 5]
![image.png](https://img-blog.csdnimg.cn/img_convert/b7da15b78286e01079b6ffff3870e1e3.png#align=left&display=inline&height=417&margin=[object Object]&name=image.png&originHeight=417&originWidth=494&size=13094&status=done&style=none&width=494)
# 获取dataframe 一列的数据
df['日期']
# 获取dataframe 几列的数据
df[['x', 'y']]
# 同样的也可以使用loc 按标签取 或者 iloc 按行号取
df.loc['T001'] # 按行标签获取,返回Series
df.iloc[0] # 按位置信息获取,返回Series
# 使用at和iat 获取具体某个数据
df.at['a', 'c'] # 按标签信息,传入行列标签索引信息 获取具体某个数据
df.iat[1, 2] # 按位置信息,传入行列位置信息,获取具体某个数据
# 新版本中pandas中 df 似乎不能使用ix,1.x 后被移除了
# ix 可以同时接受标签索引和位置信息作为参数
df.ix['a', 2]
df.ix[['a', 'b'], ['', 2]]
# 基本的可以通过head 和 tail 方法获取数据
df.head(3) # 前三行
df.tail(3) # 后三行
切片 取值
df.loc["b" : "e", "bx" : "ex"] # 传入行列的标签索引值进行切片
df1.iloc[2 : 6, 2 : 4] # 传入行列的位置信息进行切片
# df 的布尔选择
val = np.arange(10, 60).reshape(10, 5)
col = ["ax", "bx", "cx", "dx", "ex"]
idx = list("abcdefghij")
df1 = pd.DataFrame(val, columns = col, index = idx)
# 设定逻辑条件
bs = df1["bx"] > 30
# 通过df[筛选条件] 获取筛选后的结果,
print df1[bs]
# 返回同样是df 对象,同样可以进行各种操作
print df1[bs][["ax", "ex"]]
print df1[bs]["e": "h"]
一般情况下,以上几种访问方式基本能够满足使用。需要注意的是,在访问dataframe时,访问df中某一个具体元素时需要先传入行表索引再确定列索引。
对元素进行操作的前提就是先读取到数据,因此能正常读取到数据,修改也就是顺理成章了。
# 最基本的 通过标签直接访问并进行操作
df['单价'] *= 2
# 但借助apply 函数可以完成更强大的功能
# apply支持传入修改函数,能处理更复杂的场景
# 等价于, df['单价'] = df.apply(lambda x: x['单价'] * 2, axis=1)
# 更新df 的列数值,可通过赋值的方式更新
df['q'] = pd.Series([1, 2, 3, 4, 5])
# 更新df 的 行数值,可通过loc赋值的方式更新
df.loc['行label'] = pd.Series([1, 2, 3])
# 添加一个新列,直接使用= 进行赋值
df['运费'] = pd.Series({'2018_T001': 10, '2018_T005': 12})
# 或者使用insert 方法,可以在指定位置添加一个新列
nval = np.arange(100, 110).reshape(10, 1)
df.insert(1, "gx", nval)
# 也可以通过loc 添加
nval = val = np.arange(100, 110).reshape(10, 1)
df1.loc[:, "ix"] = nval # 传入行列索引信息,确定新列标签名
# 添加新行
df.append(df2) # 添加新行,使用append 方法即可
# concat 多列连接
# concat函数可以连接多个dataframe数据组成一个更大的dataframe数据
df3 = pd.concat([df1, df2[5:], df1[:5],df2], axis = 1)
# concat 多行连接 与多列连接的方式仅在于axis 参数指定,axis=0按行操作即多行连接,否则按列连接
# 删除一列,在原有的dataframe上进行操作
del df['日期']
或是使用 pop 方法,返回被删除的数据列(只能是某一列)
df.pop('cx')
# 通过 drop 方法,可以指定删除多列
df.drop(['a', 'b'], axis=0,1) # axis 指定按行执行或是按列执行
# 删除行 也可以通过drop 操作
df.drop(['a', 'b']) # 可以指定多行
# 通过切片,布尔判断 也可以实现
以上只是基本的修改,删除新增的方式,更复杂的 过滤 筛选 计数 排序 等功能未记录
# 目前一般而言,获取到最多的方式就是 读取文件获取
# read_csv, read_excel等方法 可以从 csv等文本文件 或 excel 文件读取数据
# 读取excel 文件,指定sheetname 表名
df = pd.read_excel("path/demo.xlsx", sheetname=0)
# 指定 sheetname
df = pd.read_excel("path/demo.xlsx", sheetname='销售记录')
# 读取文本文件,传入文件路径,delimiter或seq 指定以什么为分隔符,index_col 可以选择以哪一列为标签索引
df = pd.read_csv('demo.dat', delimiter='|', index_col='编号') # index_col指定行标签为索引
目前而言,使用最多的应该会是读取文本文件的方式,读取到文件后就是一个dataframe 对象,之后的操作都是基于dataframe和series 来。
1).如果其中一个是数值,那么这个数值会和DataFrame的每个位置上的数据进行相应的运算。 2).参与运算的如果是两个DataFrame,有可能所有的行、列是一致的,那么运算时对应行列的位置进行相应的算术运算,若行列没有对齐,那么填值NaN。 3). 如果参与运算的一个是DataFrame,另一个是Series,那么pandas会对Series进行行方向的广播,然后做相应的运算。 4). 参与运算的两个DataFrame并非完全一样,即行列个数和行列名有可能都不同,那么有对应上的就做运算,无填充NaN。 5). 列方向也有相应的计算处理方式。如果是列方向的运算,一个是dataFrame,另一个是Series,首先将Series沿列方向广播,然后运算。
获取df 的列标签(列索引)值
获取df 的形状,即几行几列
获取df 的value的个数
返回当前df 的数据 和 index,columns 相对应
返回df 的每列值的数据类型
ndim 获取df 的 阶数,可以看成是维度数
对df 进行转置,即列和行颠倒。
pandas中的函数 一般会有两种结果,一是copy,即返回一个修改后的副本,原有的不变,二是inplace,即在原有基础上直接进行修改。 而且,这个一般会有一个inplace 的参数值指明是否是在原有基础上修改。
因为series 具有字典的一些特征,所以允许使用get 方法来获取数值,如果没有则返回默认值,而get_value 功能类似,但如果没有对应key则会抛出异常。
add 类似+ 运算,将两个series 相加得到结果,append 则是将一个series 连接在前一个series的后面,类似列表的相加。
统计series中非nan 的值,即非空值计数。
按索引排序 或 按数值排序,默认升序排列。
重置series 的index索引,同时有drop 参数可以选择是否删除索引。
reindex函数可以将series的index换成其他的index。新的series保留原serie的values值,如果新的index和原series的index不同,则不同的填充NaN值,或者使用fill_value参数指定填充值。
sum 求和函数。mean 求均值,同时有skipnan参数可选是否忽略nan 空值。
可获取一系列的统计信息,包含最大最小值,标准差,计数等统计信息。
max 获取series中最大值,idmax 获取最大值的标签或索引。
var 获取series 的方差,std 获取标准差是对var 的求算术平方根,mad 平均绝对离差,是用样本数据相对于其平均值的绝对距离来度量数据的离散程度
注意:dataframe 中的统计函数与series中的相关统计函数基本一致,使用方法基本没有区别。
divmod(x, y) divmod() 函数返回当参数 1 除以参数 2 时包含商和余数的元组。