数据分析之读取数据
Pandas读取JSON文件函数
函数 | 用法 | 返回值 |
read_json | pd.read_json(文件路径) | 由读取的JSON文件数据生成的DataFrame |
Pandas读取CSV文件函数
函数 | 用法 | 返回值 |
read_csv | pd.read_csv(文件路径) | 由读取的CSV文件数据生成的DataFrame |
read_csv函数的一些其他参数:
参数 | 赋值 | 作用 |
header | None | 不以CSV文件数据的第一行为所生成DataFrame的列名 |
index_col | 列名 | 以CSV文件数据的指定列为标签索引 |
DataFrame的一些配置
实际上是通过给set_option函数传参数来配置。
配置 | 作用 |
pd.set_option(“display.max_columns”, 数量) | 设置DataFrame展示列数的上限 |
pd.set_option(“display.max_colwidth”, 数量) | 设置DataFrame每列中元素包含字符的上限 |
数据分析之评估清洗数据
就像刚买来的菜可能会有些脏需要先清洗再做饭。刚刚读取到的数据可能也是脏乱的数据,所以也需要先清洗一下,这样才能确保数据分析得到干净的分析结果。
而清洗前评估能使我们更有效和准确的对数据进行清洗。那么如何评估数据呢?
评估数据
评估数据的时候主要看两个方面:结构和内容。
依据结构,数据可分为:
- 乱数据:结构方面需要清理的数据
- 整洁数据:结构方面不需要清理的数据
整洁数据需要具有以下三大特点:
- 每列是一个变量
- 每行是一个观察值
- 每个单元格是一个值
可以通过DataFrame的info、head、tail、sample等方法来评估。
依据内容,数据可分为:
- 脏数据:内容方面需要清理的数据
- 干净数据:内容方面不需要清理的数据
脏数据包括:
- 丢失数据,值为NaN
- 重复数据
- 不一致数据,如”一班”和”1班”虽然意思相同,但是不利于代码进行分析
- 无效和错误数据,即无关数据或过度夸张的数据等。
不过有时候可以允许数据为NaN或者重复,具体问题具体分析。
对于脏数据评估可以使用的一些方法:
脏数据类型 | 方法 |
丢失数据 | DataFrame的info、isnull和sum的组合等 |
重复数据 | DataFrame的duplicate等方法 |
不一致数据 | Series的value_counts等方法 |
无效和错误数据 | Series的sort_values、DataFrame的describe等 |
清洗数据
对于数据结构清洗的一些解决思路:
乱数据结构 | 方法 |
列包含多个变量 | 拆分列为多列,看情况可能还要重塑 |
行包含多条信息 | 拆分行为多行,看情况可能还要重塑 |
每列是观察值 | 行列转置 |
对于数据内容清洗的一些解决思路:
脏数据类型 | 方法 |
丢失数据 | 1.人工填入缺失值 2.不处理缺失值 3.把有缺失值的行删除 4.用平均值等填充代替缺失值 |
重复数据 | 删除 |
不一致数据 | 进行统一 |
无效和错误数据 | 删除或替换 |
其他注意点:
- 手机号不应该参与运算,所以应该为字符串类型
- 对于只有“是”和“否”两个值的列,用“True”和“False”代替更好
DataFrame改变索引和列名的方法
方法 | 用法 | 返回值 | 是否改变原值 |
rename | DataFrame.rename(index={旧索引1:索引1, 旧索引2:索引2, …}) DataFrame.rename(columns={旧列名1:列名1, 旧列名2:列名2, …}) | 修改索引后的新DataFrame 修改列名后的新DataFrame | 否 |
rename | DataFrame.rename(index=某函数/方法) DataFrame.rename(columns=某函数/方法) | 索引经过函数或方法转换后的新DataFrame 列名经过函数或方法转换后的新DataFrame | 否 |
set_index | DataFrame.set_index(列名) | 指定列变成索引的新DataFrame | 否 |
reset_index | DataFrame.reset_index(列名) | 索引变为初始位置索引的新DataFrame | 否 |
sort_index | DataFrame.sort_index() DataFrame.sort_index(axis=1) | 对索引排序后的新DataFrame 对列名排序后的新DataFrame | 否 |
补充:如果方法有可选参数inplace,则指定其为True则会使该方法改变DataFrame原值。
DataFrame对列进行拆分
使用Series的str属性中的split方法,例子如下:
df[["人口", "密度"]] = df["人口密度"].str.split("/", expand=True)
表示以”/”为间隔符拆分列名,expand=True表示分成单独的Series。当然”人口密度”列还需要用drop方法删除掉,这里就不写了。
DataFrame对列进行合并
使用Series的str属性中的cat方法,例子如下:
df = df["姓"].str.cat(df["名"])
表示将”姓”和”名”两列合并。不过还有个可选参数sep,可以用来指定两列值用什么分隔符,如:
df = df["姓"].str.cat(df["名"], sep="-")
DataFrame把列名转换为变量值
函数 | 用法 | 返回值 | 是否改变原值 |
melt | pd.melt(df, id_vars=[列名1, 列名2, …], var_name=新列名1,value_name=新列名2) | 除了指定列名,其他列名都转换为新列1的值,对应值都转换为新列2的值的DataFrame | 否 |
DataFrame把行进行拆分
方法 | 用法 | 返回值 | 是否改变原值 |
explode | DataFrame.explode(行名) | 行被拆分的新DataFrame | 否 |
DataFrame对整列缺失值进行填充
DataFrame[列名] = 填充值
DataFrame对某个缺失值进行填充
DataFrame.loc[标签索引, 列名] = 填充值 DataFrame.iloc[位置索引, 位置列名] = 填充值
DataFrame对部分缺失值进行填充
DataFrame.loc[标签索引1:标签索引2, 列名] = 填充值 #还有诸如此类使用切片来筛选出部分DataFrame来填充值的形式。
DataFrame和Serise自动找到缺失值进行填充
方法 | 用法 | 返回值 | 是否改变原值 |
fillna | DataFrame.fillna(填充值) | 填充完所有缺失值的新DataFrame | 否 |
fillna | Series.fillna(填充值) | 填充完所有缺失值的新Series | 否 |
DataFrame删除存在缺失值的行
方法 | 用法 | 返回值 | 是否改变原值 |
dropna | DataFrame.dropna() | 删去所有存在缺失值的行的新DataFrame | 否 |
dropna | DataFrame.dropna(subset=[列名1, 列名2,…]) | 删除指定列名中存在缺失值的行的新DataFrame | 否 |
若指定axis参数的值为1,则是删除存在缺失值的列。
DataFrame和Serise删除重复数据
方法 | 用法 | 返回值 | 是否改变原值 |
drop_duplicates | DataFrame.drop_duplicates() | 删除重复的行的新DataFrame | 否 |
drop_duplicates | Series.drop_duplicates() | 删除重复元素的新Series | 否 |
对于DataFrame的drop_duplicates若传入参数keep为’last’,则保留所有重复值的最后一行
同理对于DataFrame的drop_duplicates也可以传入subset参数来指定作为判断是否有重复值的列/行。
DataFrame和Series对值进行替换
方法 | 用法 | 返回值 | 是否改变原值 |
replace | DataFrame.replace(原始值,替换值) DataFrame.replace(原始值列表,替换值) DataFrame.replace(替换字典) | 值替换后的新DataFrame | 否 |
replace | Series.replace(原始值,替换值) Series.replace(原始值列表,替换值) Series.replace(替换字典) | 值替换后的新Series | 否 |
Series对值的类型进行转换
方法 | 用法 | 返回值 | 是否改变原值 |
astype | Series.astype(新类型) | 所有元素转换成新类型的新Series | 否 |
tip:在Pandas里面字符串是object类型
Pandas将Series元素类型转换为datetime的函数
函数 | 用法 | 返回值 | 是否改变原值 |
to_datetime | pandas.to_datetime(Series) | 所有元素转换成datetime的新Series | 否 |
Pandas的分类数据和数值数据
Pandas有一个数据类型叫category,该数据类型的数据为分类数据,也就是包含有限数量的不同类别的数据,我的理解是相当于c语言的枚举类型。
数值数据是某个具体的数值,对其做数学运算是有意义的。
tip:使用Series的astype方法将类型转换为category时要对category加引号,因为这不是python的原生类型
数据分析之保存数据
Pandas写入csv文件函数
函数 | 用法 | 返回值 |
to_csv | Dataframe.to_csv(文件路径) | None |
to_csv函数的一些参数:
参数 | 赋值 | 作用 |
index | False | 不将索引写入文件 |