目录
1.2、读取、保存excel 文件【小代码库excel处理】
3.1、对数据进行整体查看 .info() .head() .tail()
NLP Numpy、Pandas、Scikit-learn资料:
NLP Numpy、Pandas、Scikit-learn资料下载
一、读写数据文件
1.1、 读取、保存csv文件
import numpy as np
import pandas as pd
df_csv = pd.read_csv('./data/data1_try_read.csv', encoding='utf-8')
df_csv.loc[0, '城市'] = '上海'
df_csv
df_csv.loc[0, '城市'] = '上海' # 更改 dataframe的数据【直接赋值即可】
df_csv
# 保存为 csv 文件
df_csv.to_csv('./data/data1_try_output.tsv', sep='\t', encoding='utf-8', index=False, header=None) #
1.2、读取、保存excel 文件【小代码库excel处理】
import numpy as np
import pandas as pd
df_excel = pd.read_excel('./data/data2_try_read.xlsx') # 具体可以看小代码库中对excel的处理【https://blog.csdn.net/qq_16555103/article/details/107178264】
df_excel.loc[3] = ['语文', 60, '韩梅梅'] # dataframe 添加数据【直接赋值,不存在就会新增数据】
df_excel
df_excel.to_excel('./data/data2_try_output.xlsx', index=None, sheet_name='成绩单')
二、基本数据类型
2.1、第一种数据类型Series
import numpy as np
import pandas as pd
sr1 = pd.Series([1, 2, 3, 4], index=[101, 102, 103, 104])
101 1
102 2
103 3
104 4
dtype: int64
tip:Series 中整形默认的数据类型是 int64,而numpy整形默认的数据类型是int32
import numpy as np
import pandas as pd
sr1 = pd.Series([1, 2.5, 3, 4], index=[101, 102, 103, 104])
101 1.0
102 2.5
103 3.0
104 4.0
dtype: int64
tip:Series 如果仅仅存在整形与浮点型,series会将整形转化为浮点型数据【dataframe不会这样】
2.1.1、Series的常见属性
import numpy as np
import pandas as pd
sr1.dtype # dtype('int64')
sr1.name
sr1.index # Int64Index([101, 102, 103, 104], dtype='int64')
sr1.values # 转化为numpy数组,因此不同的数据类型将会转化为一种
2.1.2、Series的索引和切片
a、简单的切片方式【不推荐】
import numpy as np
import pandas as pd
# 索引取值
sr1[102] # 默认使用的是 .loc
# 切片
str[1:2] # 默认使用的 .iloc
tip:这种方式很混乱,所以不建议使用直接 索引或者是切片的方法,推荐使用 .loc .iloc 的方式
b、正规的切片方式 .iloc .loc【推荐】
.loc 使用索引名称进行索引【tip:只有 .loc方法支持bool索引,.iloc不支持】
sr1.loc[103] # 是一个值
sr1.loc[102:103] # 使用名称索引时,切出来的是前后闭区间; tip:切片的结果是一个Series,即使他只有一个元素,这一点要区别于索引取值
sr1.loc[[101, 103]]
sr1.loc[[True, False, False, True]]
# 布尔型的索引
sr1.loc[sr1>2] # 注意:只有 .loc的方式支持bool索引
.iloc 使用下标进行索引
sr1.iloc[2] # 使用下标索引
sr1.iloc[2:3] # 下标切片,前比后开的区间
sr1.iloc[[1, 3]]
2.1.3、Series的增删改
a、Series的查看:上文切片与索引均为查看方式
# 原始Series
print(sr1)
b、Series更改数据:上文切片与索引 直接赋值即可
# 按索引更改单个值
sr1.loc[101] = 666
# 按切片更改多个值
sr1.iloc[2:4] = [33, 44]
# 按逻辑索引更改符合条件的多个值
sr1.loc[(sr1>10) & (sr1<100)] = 0
c、Series增加数据:上文切片与索引 直接赋值即可,不存在即为添加数据
# 增加一个值
sr1.loc[105] = 5
# 使用 .append 方法 【tip:被append 的数据必须是Series,即便是一个值,也要转化为Series】
sr1.append(pd.Series([2], index=[105]), verify_integrity=False)
d、Series删除数据:.drop、del、pop
drop:
注意:
- drop删除只能使用名称索引【不能是下标索引】
- drop方法仅返回一个新对象,不影响原Series,要更改原Series对象则需要设置inplace参数
sr1 = sr1.drop(102) # tip:需要重新赋值原数组
del 、pop
注意:
- del 直接删除不会复原
- pop() 对下标进行删除,可以返回删除的值,默认重末尾开始删除
2.2、第二种数据类型:DataFrame
# 字典的一阶key是列名,二阶key是行索引名
df1 = pd.DataFrame({"a": [1, 2, 3], "b": [4, 5, 6]},
index=[101, 102, 103])
out:
a b
101 1 4
102 2 5
103 3 6
# 直接使用 数据 + index + columns 创建DataFrame【这种方式也可以创建一个空的DataFrame】
df2 = pd.DataFrame(np.arange(1, 13).reshape((3, 4)),
index=[101, 102, 103],
columns=["年龄", "价格", "金额", "人口"])
out:
年龄 价格 金额 人口
101 1 2 3 4
102 5 6 7 8
103 9 10 11 12
2.2.1、DataFrame的常见属性
df1.dtypes # tip:相对于 Series来说,这里添加了 ‘s’
df1.columns
df1.index
df1.values
df1.shape
df1.size
df1.ndim
2.2.2、DataFrame的索引和切片★
a、简单的切片方式【不推荐】
import numpy as np
import pandas as pd
# 列索引【DataFrame直接索引默认是索引列】
# 列的简单索引第一种方式(重点,特别常用)
df2['年龄']
out:
101 1
102 5
103 9
Name: 年龄, dtype: int32
# 列的简单索引第二种方式(不推荐!)
df2.年龄
out:
101 1
102 5
103 9
Name: 年龄, dtype: int32
# 多个列同时索引(常用)
df2[['年龄', '金额']]
年龄 金额
101 1 3
102 5 7
103 9 11
tip: 逻辑索引使用行索引的
import numpy as np
import pandas as pd
# 简单的行索引
# 逻辑索引方式
df2[[False, True, True]] # tip: 这种逻辑索引是使用行索引的
out:
年龄 价格 金额 人口
102 5 6 7 8
103 9 10 11 12
# 逻辑索引
df2[df2['人口']<10]
out:
年龄 价格 金额 人口
101 1 2 3 4
102 5 6 7 8
b、正规的切片方式 .iloc .loc .at .iat【推荐】
更规范的多个值索引或切片loc
与iloc
重点:只要涉及到行列同时定位的多个值索引或切片,一律使用
loc
与iloc
注意:
- 使用
loc
时,可以混合使用单个索引
、列表形式多个索引
、逻辑索引
,而且使用名称的方式代码可读性更高,应优先考虑使用loc
- 但使用
iloc
时,只可以混合使用单个索引
、列表形式多个索引
,无法使用逻辑索引
.loc 使用索引名称进行索引【tip:只有 .loc方法支持bool索引,.iloc不支持】
# 多个值以行列名称索引示例1
df2.loc[102, ['年龄', '价格', '人口']]
out:
年龄 5
价格 6
人口 8
Name: 102, dtype: int32
# 多个值以行列名称索引示例2
df2.loc[[101, 103], '价格':'金额']
out:
价格 金额
101 2 3
103 10 11
# 多个值以行列名称索引示例3
df2.loc[df2['价格']>4, '金额':'人口']
out:
金额 人口
102 7 8
103 11 12
# 使用 loc 中的bool 索引与列 来重新赋值另一个dataframe使用 loc 中的bool 索引与列的值
content_df.loc[~content_df['违规类型'].isnull(),['投放主题']] =
content_df.loc[~content_df['违规类型'].isnull(),['违规类型']].values
tip:上述 赋值的过程中一定要加上 .values将其转化为数组,否则可能赋值失败
.iloc 使用下标进行索引
# 多个值以行列名称索引示例1
df2.iloc[2, [0, 2, 3]]
out:
年龄 9
金额 11
人口 12
Name: 103, dtype: int32
# 多个值以行列名称索引示例2
df2.iloc[[1, 2], 0:2]
out:
年龄 价格
102 5 6
103 9 10
.at .iat 最高效的索引一个值,不会创建新的内存空间
at # 使用索引名称
iat # 使用下标
2.2.3、DataFrame的增删改查
增添和更改值:实际上,增和改就是在索引定位的基础上进行赋值操作
import numpy as np
import pandas as pd
df2
out:
年龄 价格 金额 人口
101 1 2 3 4
102 5 6 7 8
103 9 10 11 12
df2.loc[102, '价格':'金额'] = [66, 77]
out:
年龄 价格 金额 人口
101 1 2 3 4
102 5 6 7 8
103 9 10 11 12
删除值:drop
注意:
- drop删除只能使用名称索引
- 用axis参数指定删除行/列,默认axis=0,即删除行,可指定axis=1用于删除列
- drop方法仅返回一个新对象,不影响原DataFrame,要更改原DataFrame对象则需要设置inplace参数
df2.drop(102)
out:
年龄 价格 金额 人口
101 1 2 3 4
103 9 10 11 12
df2.drop(['年龄', '人口'], axis=1)
价格 金额
101 2 3
102 6 7
103 10 11
三、对DataFrame进行统计分析★
3.1、对数据进行整体查看 .info() .head() .tail()
import numpy as np
import pandas as pd
df.info()
df.head(5)
df.tail(5)
3.2、对数据进行整体的统计描述 .describe()
import numpy as np
import pandas as pd
df4 = pd.DataFrame({"a": [53, 232, 85],
"b": [1.94, 23.8, np.nan]})
out:
a b
0 53 1.94
1 232 23.80
2 85 NaN
df4.describe().round(0).T # round(0) : 取小数点0位,tip:describe不会统计 NaN 的值
count mean std min 25% 50% 75% max
a 3.0 123.0 95.0 53.0 69.0 85.0 158.0 232.0
b 2.0 13.0 15.0 2.0 7.0 13.0 18.0 24.0
# 数据如果不是数字,describe()得到的结果是有差异的
df5 = pd.DataFrame({"城市": ["北京", "杭州", "乌鲁木齐"],
"猫": ["波斯", "布偶", "布偶"]})
out:
城市 猫
0 北京 波斯
1 杭州 布偶
2 乌鲁木齐 布偶
df5.describe()
out:
城市 猫
count 3 3
unique 3 2
top 杭州 布偶
freq 1 2
# 如果 数值的数据类型与字符串的数据类型同时存在,describe只会统计数值类数据类型【如果相同统计字符串数据类型,只能将这些字符串列取出,然后进行 describe() 】
df6 = pd.DataFrame({
"姓名": ["韩梅梅", "李雷", "露西"],
"爱好": ["吃", "跳", "跳"],
"体重": [180, 90, 110]
})
out:
姓名 爱好 体重
0 韩梅梅 吃 180
1 李雷 跳 90
2 露西 跳 110
df6.describe().T
out:
count mean std min 25% 50% 75% max
体重 3.0 126.666667 47.258156 90.0 100.0 110.0 145.0 180.0
df6[["姓名", "爱好"]].describe()
out:
姓名 爱好
count 3 3
unique 3 2
top 李雷 跳
freq 1 2
3.3、对单个统计量的分析
常见的函数列表
import numpy as np
import pandas as pd
df7 = pd.DataFrame(np.random.randn(5, 6), columns=list('ABCDEF'), index=range(101, 106))
df7["C"] = list("王牌对王牌")
out:
A B C D E F
101 0.403545 -2.258201 王 -0.753228 0.860266 1.419144
102 -0.792360 0.661638 牌 -1.479688 -1.361139 -0.353684
103 0.468519 0.725593 对 -0.701611 -1.077419 0.360764
104 -1.021946 -1.395921 王 1.480520 -0.024066 1.423713
105 -0.087719 0.970290 牌 -0.213864 0.804652 -0.898303
# 查看B列和F列特征的均值【默认是对列进行统计,对行统计请指定 axis=1】
df7[["B", "F"]].mean()
out:
B -0.259320
F 0.390327
dtype: float64
# 查看103和105行特征的方差
df7.loc[[103, 105], :].var(axis=1)
out:
103 0.629796
105 0.595793
dtype: float64
# 查看C列的众数
df7["C"].mode()
out:
0 牌
1 王
dtype: object
3.4、类别变量频词统计 .value_counts()
import numpy as np
import pandas as pd
df7["C"].value_counts()
out:
王 2
牌 2
对 1
Name: C, dtype: int64
四、Pandas的MultiIndex多层索引使用
Pandas的MultiIndex多层索引创建高维dataframe与使用
python Dataframe多索引切片操作 行多层索引
Pandas详解十四之DataFrame对象的列和索引之间的转化
层次索引正常情况下切片高维行索引会报错,以下两个方法可以解决:
①使用数组的方式进行切片
df.loc[[(一级索引,二级索引,三级索引),(一级索引,二级索引,三级索引),(一级索引,二级索引,三级索引),(一级索引,二级索引,三级索引)],列索引]
② 构造 pd.multiindex 的层次索引后,用层次索引进行切片
multi = pd.multiindex.from_tuples([[],[],[]]) # pd.multiindex 有三种构造方式,详情看上面链接
df.loc(multi,列索引)
tip:层次索引不能用赋值的方法新增数据,没有key会报错,可以用reset_index() 将高维转化为2维,新增数据后用set_index()转化为高维