pandas查漏知识点
关于将pandas数据写入mysql中:重新认识to_sql函数
方法函数
def to_sql(self, name, con, schema=None, if_exists='fail', index=True,
index_label=None, chunksize=None, dtype=None, method=None):
- 参数:
name(必填): 指定的是将输入接入数据库当做的哪个表。
con(必填):与数据库链接的方式,推荐使用sqlalchemy的engine类型;
schema: string,optional;相应数据库的引擎,不设置则使用数据库的默认引擎,如mysql中的innodb引擎
if_exists: {‘fail’,‘replace’,‘append’},默认’fail’;当数据库中已经存在数据表时对数据表的操作,有replace替换、append追加,fail则当表存在时提示ValueError。
index:布尔值,默认为True;对DataFrame的index索引的处理,为True时索引也将作为数据写入数据表。
index_label:字符串或序列,默认为None;当上一个参数index为True时,设置写入数据表时index的列名称。
chunsize:int,可选;设置整数,如20000,一次写入数据时的数据行数量,当数据量很大时,需要设置,否则会链接超时写入失败。
dtype:dict,可选;写入数据表时,可以设置列的名称(The keys should be the column - 注意:
在将数据存入mysql中时,理论上说在mysql中的数据应该是有主键的,因此在index参数默认应该为true。但是,需要注意,当index选择了true,即在数据库中存在以index为主键的列了,再次从mysql读取数据时,在利用duplicated判断重复数据时,需要剔除index列进行判断。
关于ps.read_sql()返回值
在连接sql后,读取数据后,对返回值进行处理时,想获取数值,但是始终不对。经过仔细查看,自己忘记了ps.read_sql()和sql.read_csv()函数返回值类型是pandas.core.frame.DataFrame类型的了。
可以直接利用该类型的特性,columns和values方法进行取。
print(undeal_rate.columns.values[0])
print(undeal_rate[undeal_rate.columns.values[0]].values[0])
关于pandas.DataFrame.drop_duplicates
- 方法函数
DataFrame.drop_duplicates(subset=None, keep='first', inplace=False, ignore_index=False)
参数:
subset: 列名,可选,默认为None;
keep: {‘first’, ‘last’, False}, 默认值 ‘first’。first: 保留第一次出现的重复行,删除后面的重复行。last: 删除重复项,除了最后一次出现。
False: 删除所有重复项。
inplace:布尔值,默认为False,是否直接在原数据上删除重复项或删除重复项后返回副本。(inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本。)
- 实例
# 去除完全重复行数据
data.drop_duplicates(inplace=True)
# 去除某几列
data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
关于pandas.DataFrame.reset_index
- 方法函数
DataFrame.reset_index(level=None, drop=False, inplace=False, col_level=0, col_fill='')
参数:
level:数值类型可以为:int、str、tuple或list,默认无,仅从索引中删除给定级别。默认情况下移除所有级别。控制了具体要还原的那个等级的索引 。
drop:默认为False。当指定drop=False时,在获得新的index,原来的index变成数据列,保留在数据框中,不想保留原来的index的话可以使用参数drop=True,默认False。
inplace:输入布尔值,表示当前操作是否对原数据生效,默认为False。
col_level:数值类型为int或str,默认值为0,如果列有多个级别,则确定将标签插入到哪个级别。默认情况下,它将插入到第一级。
col_fill:对象,默认‘’,如果列有多个级别,则确定其他级别的命名方式。如果没有,则重复索引名。
pandas.DataFrame.sort_values
- 方法函数
DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last', ignore_index=False, key=None)[source]
参数:
by:str 或 str的list; 要排序的名称或名称列表。如果axis是0或’index’,那么by可能包含索引级别and/or列标签。如果axis是1或’columns’,那么by可能包含列级别and/or索引标签。
允许指定索引或列级名称。
axis :{0 或‘index’, 1 或‘columns’}, 默认为 0,要排序的轴(axis)。
ascending :bool 或 bools的list, 默认为 True。升序和降序排序。指定多个排序顺序的列表。如果这是一个布尔的list,必须匹配的长度的by。
inplace :bool, 默认为 False。如果为True,就地执行操作。
kind :{‘quicksort’, ‘mergesort’, ‘heapsort’}, 默认为 ‘quicksort’选择排序算法。mergesort是唯一稳定的算法。对于DataFrames,仅在对单个列或标签进行排序时才应用此选项。
na_position :{‘first’, ‘last’}, 默认为 ‘last’,如果首先将NaN放在开头; 最后将NaN放在最后。
ignore_index :bool, 默认为 False。如果为True,则结果轴将标记为0、1,…,n-1。
key:callable, 可选的在排序之前,将键函数应用于这些值。这类似于内建函数中的key参数sorted(),但值得注意的区别是此key函数应被向量化。它应该期望Series并返回与输入形状相同的Series。它将应用于by独立的每一列。
- 实例
>>> df.sort_values(by='col1', ascending=False)
col1 col2 col3 col4
4 D 7 2 e
5 C 4 3 F
2 B 9 9 c
0 A 2 0 a
1 A 1 1 B
3 NaN 8 4 D
同理可以看pandas.DataFrame.sort_index;
重新认识replace函数
在对数据进行清洗的时候,我遇到了需要替换其他的一些信息。发现,有好几个replace,这里对replace重新认识一下。
字符串中的replace
方法
str.replace(old, new[, max])
其中:
old – 将被替换的子字符串。
new – 新字符串,用于替换old子字符串。
max – 可选字符串, 替换不超过 max 次
说明
该方法针对字符串而言的。返回字符串中的 old(旧字符串) 替换成 new(新字符串)后生成的新字符串,如果指定第三个参数max,则替换不超过 max 次。
实例
#!/usr/bin/python
str = "this is string example....wow!!! this is really string";
print str.replace("is", "was");
print str.replace("is", "was", 3);
注意:
- 该replace 不会改变原 string 的内容。
- 该replace一次只能替换一次值,若需多次替换则需要使用如下形式
str.replace(old1, new1).replace(old2, new2)
pandas中的replace
pandas数据两大类型,series和dataframe。如果要替换里面元素的值,则需要对该类型使用replace。
说明
- 该raplace是针对pandas特有的数据结构而言,而不是针对字符串而言。
- 该replace替换的是series或者dataframe中的元素值,而不是元素中的字符值。
- 该方法使用后,不会修改之前数据中的元素值。
方法
# 将某一个元素替换成另一个元素
data.replace(old, new)
# 多个元素替换成同一个值, 利用列表
data.replace([old1, old2, ...], new)
# 多个元素替换成不同的值
## 法1:利用字典
data.replace({old1:new1}, {old2, news},...)
## 法2: 利用列表
data.replace([old1, old2], [new1, new2], ...)
# 对指定目标列进行替换成相同值
data.replace({列名1:[old1, old2, ...]}, {列名2: [old3, old4,...]}, new)
# 对指定目标列进行替换成不同值
data.replace({列名1:{old1: new1, old2: new2, ...}, {列名2: {old3: new3, ...}}})
参考24_Pandas.DataFrame,Series元素值的替换(replace)
pandas中str.replace
说明
在pandas中可能要对元素中的一些字符元素进行批量处理,理论上来讲,可以通过将pandas数据类型转为str类型,然后利用python标准库中的replace等函数进行处理;但是这样处理方法比较冗杂。
在pandas中准备了处理字符串的方法,以便处理series和dataframe中的特定字符元素。
预备的方法
- 替换
str.replace():替换字符串 - 空白削除
str.strip():删除左右两侧的空白(开始/结束)
str.lstrip():删除左侧空白
str.rstrip():删除右侧空白 - 大小写変换
str.lower():转换为小写
str.upper():转换为大写
str.capitalize():将第一个字母转换为大写,将其他字母转换为小写
str.title():将单词的首字母转换为大写,其余转换为小写
方法
Series.str.replace(pat, repl, n=- 1, case=None, flags=0, regex=None)
其中,
pat:str 或 compiled regex
字符串可以是字符序列或正则表达式。
repl:str 或 callable
替换字符串或可调用字符串。可调用对象被传递给正则表达式匹配对象,并且必须返回要使用的替换字符串。参考re.sub()。
n:int, 默认为 -1 (all)
从一开始要进行的更换次数。
case:bool, 默认为 None
确定替换是否区分大小写:
如果为True,则区分大小写(默认为pat是一个字符串)
设置为False表示不区分大小写
如果无法设置pat是已编译的正则表达式。
flags:int, 默认为 0 (no flags)
正则表达式模块标志,例如重新IGNORECASE。如果无法设置pat是已编译的正则表达式。
regex:bool, 默认为 True
确定是否假设passed-in模式是正则表达式:
如果为True,则假定passed-in模式为正则表达式。
如果为False,则将模式视为文字字符串
如果无法设置为Falsepat是已编译的正则表达式或repl是可调用的。
注意
如果需要将多个子字符串替换为同一个值,可以使用:
data.str.replace('old1|old2|old3...',new)
比如:
data2 = str(data['address']).str.replace('自治区|省|回族|维吾尔|壮族','')
关于pandas中的数据类型
整个pandas数据类型是series(一维数组类型)或者dataframe(多维数组类型)类型。
data.columns为pandas.core.indexes.base.Index类型。
data[类名]的数据类型是series类型,即一维数组类型。
data[类型].values为numpy.ndarray。
在pyecharts画图时,传入的参数应该是list类型,因此在取datafame数据时,需要进行list转换。