文章目录
一、pandas常用函数
Series可以运用ndarray或字典的几乎所有索引操作和函数,融合了字典和ndarray的优点。【DataFrame属性查看】
1.1 Series常用属性
函数 | 说明 |
---|---|
Series([x,y,…]) Series({‘a’:x,‘b’:y,…}, index=param1) | 通过【 list / dict 】构建一个Series |
Series.copy() | 复制一个Series |
Series.reindex([x,y,…], fill_value=NaN) Series.reindex([x,y,…], method=NaN) Series.reindex(columns=[x,y,…]) | 重返回一个适应新索引的新对象,将缺失值填充为fill_value 返回适应新索引的新对象,填充方式为method【pad, backfill】(向前填充/向后填充)对列进行重新索引 |
Series.drop(index) | 丢弃指定项 |
Series.map(f) | 应用元素级函数 |
排序函数 | 说明 |
Series.sort_index(ascending=True) | 根据索引返回已排序的新对象 |
Series.order(ascending=True) | 根据值返回已排序的对象,NaN值在末尾 |
Series.rank(method=‘average’, ascending=True, axis=0) | average 为各组分配一个平均排名max,min 使用整个分组中的最(大)小排名first 按值在原始数据中出现的顺序排名 |
df.argmax() df.argmin() | 返回含有最大值的索引位置 返回含有最小值的索引位置 |
Series.replace Series.str.replace | 对一【列】中字符串替换 对对【列】中字符串替换或批量替换 |
Series.replace
与 Series.str.replace
在字符串操作的上下文中,str.replace
默认情况下启用正则表达式替换。replace
除非使用此regex=True
开关,否则仅执行完全匹配。
import pandas as pd
all = pd.DataFrame(
{"hero":["达摩","典韦","曹操","钟无艳","墨子","赵云","吕布","孙悟空"],
"level":["hei_tie_AA","qing_tong_AA","hei_tie_BB","huang_jin_CC",\
"bai_yin","da_shi_DD","zhuan_shi_SS","wang_zhe_SSS"]})
all["level"] = all.level.str.replace("_BB","_bb").str.replace("_AA","_aa")
all["level_2"] = all.level.replace({'_CC': '_cc', '_DD': '_dd'}, regex=True)
原始数据 | 处理效果 | ||||||
hero | level | hero | level | level_2 | |||
0 | 达摩 | hei_tie_AA | 0 | 达摩 | hei_tie_aa | hei_tie_aa | |
1 | 典韦 | qing_tong_AA | 1 | 典韦 | qing_tong_aa | qing_tong_aa | |
2 | 曹操 | hei_tie_BB | 2 | 曹操 | hei_tie_bb | hei_tie_bb | |
3 | 钟无艳 | huang_jin_CC | 3 | 钟无艳 | huang_jin_CC | huang_jin_cc | |
4 | 墨子 | bai_yin | 4 | 墨子 | bai_yin | bai_yin | |
5 | 赵云 | da_shi_DD | 5 | 赵云 | da_shi_DD | da_shi_dd | |
6 | 吕布 | zhuan_shi_SS | 6 | 吕布 | zhuan_shi_SS | zhuan_shi_SS | |
7 | 孙悟空 | wang_zhe_SSS | 7 | 孙悟空 | wang_zhe_SSS | wang_zhe_SSS |
1.2 Series.str.func()字符串函数
Series.str.func() | 函数说明 | 示例:df = pd.Series([“花费_100_元”]) |
---|---|---|
cat() | 字符串连接,可指定分隔符 | eg:df['name'].str.cat(df['birthday'], sep=':') eg: df["cost_name"].str.cat(df["price"].astype("str"),sep="-") eg: df["unit"]="元" df["cost_all"] = df["price"].str.cat(df["unit"],sep=":") |
split() | 切分字符串 | df.str.split('_') 输出: [花费, 100, 元] |
get() | 获取指定位置的字符串 | |
contains | Series.str.contains(pat, case=True, flags=0, na=nan, regex=True) 返回布尔值系列/数组是否给定pattern / regex包含在Series / Index中的每个字符串中。 pat = 字符串 / 正则表达式(regex=True),case = 布尔值, 默认为True(匹配敏感)flags = 默认0。na = 默认为NaN,替换缺失值re.IGNORECASE忽略大小写regex =布尔值, 默认为True.如果为真则使用re.research,否则使用Python | df = df[df['name'].str.contains(r'.*?中国.*')] |
match | Series.str.match(pat, case=True, flags=0,na=nan,as_indexer=False) 使用传递的正则表达式 查找 Series / Index中每个字符串中的组 。 如果 as_indexer = True,请确定每个字符串是否与正则表达式匹配 | re_date = re.compile("\d{4}年\d{1,2}月\d{1,2}日") df= df.loc[df["birthday"].str.match(re_date)] |
extract | Series.str.extract(pat,flags = 0,expand = None) 从正则表达式pat的第一个匹配中 提取 组。 | df[['室','厅']] = df['户型'].str.extract('(\d+)室(\d+)厅', expand=False) |
join() | 对每个字符都用给点的字符串拼接起来,不常用 | df.str.join("-") 输出: 花-费-_-1-0-0-_-元 |
replace() | 替换 | |
repeat() | 重复元素 | df.str.repeat(2) 输出: 花费_100_元花费_100_元 |
pad() | (左右)补齐 | |
center() ljust() rjust() | 中间补齐 右补齐 左补齐 | |
zfill() | 左边补0 | |
wrap() | 指定的位置加回车符号 | |
slice() | 按给点的开始结束位置切割字符串 | |
slice_replace() | 使用给定的字符串,替换指定的位置的字符 | df.str.slice_replace(7,8,"$") 输出: 花费_100_$ |
count() | 计算给定单词出现的次数 | |
startswith() endswith() | 判断是否以某字符串开头/结束 | df.str.endswith("元") 输出: True |
findall() | 查找所有符合正则的字符,以数组形式返回 | |
extract() | 抽取匹配的字符串,注意加上括号 | |
len() | 统计字符串的长度 | |
strip() rstrip() lstrip() | 去除前后/后面/前面的空白字符 | |
partition() | 字符串切割称为DataFrame,切割为(分隔符前,分隔符,分隔符后) | |
rpartition() | 功能同上。从右切起 | |
lower() / upper() | 全部小写/大写 | |
find() / rfind() | 查找给定字符串的所在位置 /从右查起 | |
capitalize() | 首字符大写 | |
swapcase() | 大小写互换 | |
isalnum() | 是否全部是数字和字母组成 | |
isalpha() | 是否全部是字母 | |
isdigit() | 是否全部都是数字 | |
isspace() | 是否空格 | |
islower() isupper() | 是否全部小写/全部大写 | |
istitle() | 是否只有首字母为大写,其他字母为小写 | |
isnumeric() | 是否是数字 | |
isdecimal() | 是否全是数字 | |
map() | 用于匹配匿名函数 | df["total"]=df.total.map(lambda x:str(x)) |
apply() | 用于匹配函数 | def sex(x): return (1 if x=="男" elso 0) df['gender'] = df.gender.apply(sex) |
1.3 正则
正则测试网站 https://c.runoob.com/front-end/854
详情:https://blog.csdn.net/wsp_1138886114/article/details/80567587
一般字符、字符集和转义字符
一般字符 | 完全匹配字符 | abc | abc |
---|---|---|---|
\ | 转义字符 | . | . |
. | 匹配除换行符\n以外的所有字符 | . | q, 1, +, … |
[] | 匹配字符集中任意字符 | [abc] | a, b, c |
\s | 匹配空白字符,即[\n\t\f\r…] | a\sb | a b, a b, … |
\S | 匹配非空白字符 | a\Sb | ab, a4b, asb, … |
\w | 匹配单词字符,即[a-zA-Z0-9] | a\wc | abc, a8c, … |
\W | 匹配非单词字符,即[^a-zA-Z0-9] | a\Wc | a-c, a?c, … |
\d | 匹配数字 | a\dc | a3c, … |
\D | 匹配非数字 | a\Dc | adc, a-c, … |
限定匹配次数
* | 匹配前一个字符0到无限次 | ab*c | ac, abc, abbc, … |
---|---|---|---|
+ | 匹配前一个字符1到无限次 | ab+c | abc, abbc, … |
? | 匹配前一个字符0或1次 | ab?c | ac, abc |
{m} | 匹配前一个字符m次 | ab{3}c | abbbc |
{m,n} | 匹配前一个字符m至n次,m省略代表0至n次,n省略代表m至无限次 | ab{2,3}c | abbc, abbbc, … |
*? +? ?? {m}? {m,n}? | 使得*,+,?{m},{m,n}变为非贪婪模式 | ab*? | a |
限定边界
$ | 匹配字符串末尾(多行模式下是每一行字符串末尾,re.M) | c$ | abc, 12c, ?-c, … |
---|---|---|---|
^ | 匹配字符串开头(多行模式下是每一行字符串开头,re.M) | ^c | cab, c12, c??, … |
\A | 匹配整个字符串开头 | \Ac | cab, … |
\Z | 匹配整个字符串末尾 | c\Z | abc, … |
逻辑、分组
| | 或,匹配左边或者右边的表达式 | abc|def | abc, def, … |
---|---|---|---|
(…) | 括号内为一组;分组有编号,从1开始算起;分组作为一个整体,|只在分组内部有效; | (abc){1}.(123|456)+ | abc.456, abc.123, … |
(?P…) | 除编号外的另一个分组名 | ||
<number> | 引用编号为的分组匹配的字符串 | (\d)abc\1 | 5abc5, … |
(?P=name) | 引用别名为的分组匹配到的字符串 | (?P=\d)abc(?P=one) | 7abc7, … |
特殊构造
(?iLmsux) | iLmsux每个字符代表一个匹配模式 | (?!abc) | Abc, abc, … |
---|---|---|---|
(?#…) | #之后的内容作为注释被忽略 | ||
(?=…) | 之后的字符串内容需要匹配表达式,不消耗字符串内容 | a(?=\d) | 后面是数字的a |
(?!..) | 之后的字符串内容需要不匹配表达式,不消耗字符串内容 | a(?!\d) | 后面不是数字的a |
(?<=…) | 之前的字符串内容需要匹配表达式,不消耗字符串内容 | (?<=\d)a | 前面是数字的a |
(?<!..) | 之后的字符串内容需要不匹配表达式,不消耗字符串内容 | (?<!\d)a | 前面不是数字的a |
2、中文字符集
u"[\u4e00-\u9fa5]"
3、re模块常用方法
compile():编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用
pa = re.compile('et')
正则表达式对象的方法:
group() 返回被 RE 匹配的字符串。
start() 返回匹配开始的位置
end() 返回匹配结束的位置
span() 返回一个元组包含匹配 (开始,结束) 的位置
4、提取字符串
https://www.cnblogs.com/qkloveslife/p/9269553.html
import re
str = "a123b"
print re.findall(r"a(.+?)b",str)
输出['123']
二、DataFrame
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。
DataFrame可以通过类似字典的方式或者.columnname的方式将列获取为一个Series。行也可以通过位置或名称的方式进行获取。
为不存在的列赋值会创建新列。
>>> del frame['xxx'] # 删除列
属性 | 说明 |
---|---|
values | DataFrame的值 |
index | 行索引 |
index.name | 行索引的名字 |
columns | 列索引 |
columns.name | 列索引的名字 |
ix | 返回行的DataFrame |
ix[[x,y,…], [x,y,…]] | 对行重新索引,然后对列重新索引 |
T | frame行列转置 |
DataFrame常用属性
函数 | 说明 |
---|---|
DataFrame(dict, columns=dict.index, index=[dict.columnnum]) | 构建DataFrame |
DataFrame(二维ndarray) | 数据矩阵,还可以传入行标和列标 |
DataFrame(由数组、列表或元组组成的字典) | 每个序列会变成DataFrame的一列。所有序列的长度必须相同 |
DataFrame(NumPy的结构化/记录数组) | 类似于“由数组组成的字典” |
DataFrame(由Series组成的字典) | 每个Series会成为一列。如果没有显式制定索引,则各Series的索引会被合并成结果的行索引 |
DataFrame(由字典组成的字典) | 各内层字典会成为一列。键会被合并成结果的行索引。 |
DataFrame(字典或Series的列表) | 各项将会成为DataFrame的一行。索引的并集会成为DataFrame的列标。 |
DataFrame(由列表或元组组成的列表) | 类似于二维ndarray |
DataFrame(DataFrame) | 沿用DataFrame |
DataFrame(NumPy的MaskedArray) | 类似于二维ndarray,但掩码结果会变成NA/缺失值 |
重新指定index | 说明 |
df.reindex([x,y,…], fill_value=NaN, limit) | 返回一个适应新索引的新对象,将缺失值填充为fill_value,最大填充量为limit |
df.reindex([x,y,…], method=NaN) | 返回适应新索引的新对象,填充方式为method |
df.reindex([x,y,…], columns=[x,y,…],copy=True) | 同时对行和列进行重新索引,默认复制新对象。 |
df.drop(index, axis=0) | 丢弃指定轴上的指定项。 |
排序函数 | 说明 |
df.sort_index(axis=0, ascending=True) df.sort_index(by=[a,b,…]) | 根据索引排序 |
汇总统计函数 | 说明 |
df.count() | 非NaN的数量 |
df.describe() | 一次性产生多个汇总统计 |
df.min() df.max() | 最小值 最大值 |
df.idxmax(axis=0, skipna=True) df.idxmin(axis=0, skipna=True) | 返回含有最大值的index的Series 返回含有最小值的index的Series |
df.quantile(axis=0) | 计算样本的分位数 |
df.sum(axis=0, skipna=True, level=NaN) | 返回一个含有求和小计的Series |
df.mean(axis=0, skipna=True, level=NaN) | 返回一个含有平均值的Series |
df.median(axis=0, skipna=True, level=NaN) | 返回一个含有算术中位数的Series |
df.mad(axis=0, skipna=True, level=NaN) | 返回一个根据平均值计算平均绝对离差的Series |
df.var(axis=0, skipna=True, level=NaN) | 返回一个方差的Series |
df.std(axis=0, skipna=True, level=NaN) | 返回一个标准差的Series |
df.skew(axis=0, skipna=True, level=NaN) | 返回样本值的偏度(三阶距) |
df.kurt(axis=0, skipna=True, level=NaN) | 返回样本值的峰度(四阶距) |
df.cumsum(axis=0, skipna=True, level=NaN) | 返回样本的累计和 |
df.cummin(axis=0, skipna=True, level=NaN) | 返回样本的累计最大值 |
df.cummax(axis=0, skipna=True, level=NaN) | 返回样本的累计最小值 |
df.cumprod(axis=0, skipna=True, level=NaN) | 返回样本的累计积 |
df.diff(axis=0) | 返回样本的一阶差分 |
df.pct_change(axis=0) | 返回样本的百分比数变化 |
计算函数 | 说明 |
df.add(df2, fill_value=NaN, axist=1) | 元素级相加,对齐时找不到元素默认用fill_value |
df.sub(df2, fill_value=NaN, axist=1) | 元素级相减,对齐时找不到元素默认用fill_value |
df.div(df2, fill_value=NaN, axist=1) | 元素级相除,对齐时找不到元素默认用fill_value |
df.mul(df2, fill_value=NaN, axist=1) | 元素级相乘,对齐时找不到元素默认用fill_value |
df.apply(f, axis=0) | 将f函数应用到由各行各列所形成的一维数组上 |
df.applymap(f) | 将f函数应用到各个元素上 |
df.cumsum(axis=0, skipna=True) | 累加,返回累加后的dataframe |
Dataframe索引切片
索引方式 | 说明 |
---|---|
df[val] | 选取DataFrame的单个列或一组列 |
df.ix[val] (函数过期) | 选取Dataframe的单个行或一组行 |
df.ix[:,val] (函数过期了) | 选取单个列或列子集 |
df.ix[val1,val2] (函数过期了) | 将一个或多个轴匹配到新索引 |
reindex方法 | 将一个或多个轴匹配到新索引 |
xs方法 | 根据标签选取单行或者单列,返回一个Series |
icol、irow方法 | 根据整数位置选取单列或单行,并返回一个Series |
get_value、set_value | 根据行标签和列标签选取单个值 |
条件筛选:
==> 按列筛选行:
df = df[df['age'] > 10] # 年龄>10 的行
df = df[(df['sex'] =='male') & (df['age'] > 20)] # 性别=男 & 年龄>20 的行
==> 按行筛选列:(筛选第0行大于10的所有列)
df.loc[:, df.loc['0'] > 10] # 第0行所有值>10 的列
==> 行列同时条件筛选
df.loc[df['age'] > 20, df.loc['teacher'] ==''] # 年龄>20 的行,第0行所有值>10 的列
df.loc[:, (df.loc['1'] > 0) | (df.loc['age'] > 30)]
运算:
默认情况下,Dataframe和Series之间的算术运算会将Series的索引匹配到的Dataframe的列,沿着列一直向下传播。若索引找不到,则会重新索引产生并集。
三、Index
pandas的索引对象负责管理轴标签和其他元数据(比如轴名称等)。构建Series或DataFrame时,所用到的任何数组或其他序列的标签都会被转换成一个Index。Index对象不可修改,从而在多个数据结构之间安全共享。
主要的Index对象 | 说明 |
---|---|
Index | 最广泛的Index对象,将轴标签表示为一个由Python对象组成的NumPy数组 |
Int64Index | 针对整数的特殊Index |
MultiIndex | “层次化”索引对象,表示单个轴上的多层索引。可以看做由元组组成的数组 |
DatetimeIndex | 存储纳秒级时间戳(用NumPy的Datetime64类型表示) |
PeriodIndex | 针对Period数据(时间间隔)的特殊Index |
Index属性
在pandas中连接DatetimeIndex对象: https://cloud.tencent.com/developer/ask/213225
函数 | 说明 |
---|---|
Index([x,y,…]) | 创建索引 |
append(Index) | 连接另一个Index对象,产生一个新的Index |
diff(Index) | 计算差集,产生一个新的Index |
intersection(Index) | 计算交集 |
union(Index) | 计算并集 |
isin(Index) | 检查是否存在与参数索引中,返回bool型数组 |
delete(i) | 删除索引i处元素,得到新的Index |
drop(str) | 删除传入的值,得到新Index |
insert(i,str) | 将元素插入到索引i处,得到新Index |
is_monotonic() | 当各元素大于前一个元素时,返回true |
is_unique() | 当Index没有重复值时,返回true |
unique() | 计算Index中唯一值的数组 |
例子:
https://blog.csdn.net/rwangnqian/article/details/79000134