设计感的网站,网站流量分析工具,tooopen素材公社,网站建设 淘宝运营学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列
注意:本文用到的数据集在文章顶部
1.1 直…学习目标 知道df添加新列的操作 知道insert函数插入列数据 知道drop函数删除df的行或列数据 知道drop_duplicates函数对df或series进行数据去重 知道unique函数对series进行数据去重 知道apply函数的使用方法 1 DataFrame添加列
注意:本文用到的数据集在文章顶部
1.1 直接赋值添加列数据 通过 df[列名]新值 或 df[列名]series对象/list对象 添加新的一列, 新列添加到df的最后 添加列名为 城市 的一列, 值都为北京 import pandas as pd
# 加载数据集
df pd.read_csv(../data/LJdata.csv)
# 获取前5条数据并复制一份
temp_df df.head().copy()
# 添加一列数据都是固定值
temp_df[省份] 北京
print(temp_df)
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数 城市
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26 北京
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33 北京
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34 北京
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30 北京
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30 北京 添加列名为 区县 的一列, 值分别是 朝阳区、朝阳区、西城区、昌平区、朝阳区 # 列表的数据数量必须和df的行数相等
temp_df[区县] [朝阳区, 朝阳区, 西城区, 昌平区, 朝阳区]
print(temp_df)
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数 省份 区县
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26 北京 朝阳区
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33 北京 朝阳区
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34 北京 西城区
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30 北京 昌平区
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30 北京 朝阳区 添加列名为 新价格 的一列, 值比原价格列的值多1000元 # 新增数据为series对象
# print(temp_df[价格] 1000)
temp_df[新价格] temp_df[价格] 1000
print(temp_df)
# 输出结果如下区域 地址 户型 面积 价格 ... 更新时间 看房人数 省份 区县 新价格
0 燕莎租房 新源街 2室1厅 50 5800 ... 2017.07.21 26 北京 朝阳区 6800
1 望京租房 澳洲康都 2室1厅 79 7800 ... 2017.07.23 33 北京 朝阳区 8800
2 广安门租房 远见名苑 2室1厅 86 8000 ... 2017.07.20 34 北京 西城区 9000
3 天通苑租房 天通苑北一区 2室1厅 103 5300 ... 2017.07.25 30 北京 昌平区 6300
4 团结湖租房 团结湖北口 2室1厅 63 6400 ... 2017.07.26 30 北京 朝阳区 7400
1.2 insert函数添加列数据 通过 df.insert(loc,column,value) 方法在指定位置添加列 loc: 指定列位置下标数字 column: 添加列的列名 value: 添加列的所有值, series对象、列表对象、常数等 在区域列后添加列名为 城市 的一列, 值都为北京 # 获取前5条数据
new_df df.head().copy()
print(new_df)
new_df.insert(loc1, column城市, value北京)
print(new_df)
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 城市 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 北京 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 北京 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 北京 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 北京 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 北京 团结湖北口 2室1厅 63 6400 南 2017.07.26 30 在城市列后添加列名为 区县 的一列, 值分别是 朝阳区、朝阳区、西城区、昌平区、朝阳区 new_df.insert(loc2, column区县, value[朝阳区, 朝阳区, 西城区, 昌平区, 朝阳区])
print(new_df)
# 输出结果如下区域 城市 区县 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 北京 朝阳区 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 北京 朝阳区 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 北京 西城区 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 北京 昌平区 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 北京 朝阳区 团结湖北口 2室1厅 63 6400 南 2017.07.26 30 在价格列后添加列名为 新价格 的一列, 值比原价格列的值多1000元 pd.set_option(display.max_columns, None) # 展示所有列
pd.set_option(display.width, None) # 不换行显示
new_df.insert(loc7, column新价格, valuenew_df[价格] 1000)
print(new_df)
# 输出结果如下区域 城市 区县 地址 户型 面积 价格 新价格 朝向 更新时间 看房人数
0 燕莎租房 北京 朝阳区 新源街 2室1厅 50 5800 6800 南 2017.07.21 26
1 望京租房 北京 朝阳区 澳洲康都 2室1厅 79 7800 8800 东 2017.07.23 33
2 广安门租房 北京 西城区 远见名苑 2室1厅 86 8000 9000 东 2017.07.20 34
3 天通苑租房 北京 昌平区 天通苑北一区 2室1厅 103 5300 6300 东南 2017.07.25 30
4 团结湖租房 北京 朝阳区 团结湖北口 2室1厅 63 6400 7400 南 2017.07.26 30
2 DataFrame删除行列 通过 df.drop(labels, axis, inplace) 方法删除行列数据 labels: 行索引值或列名列表 axis: 删除行-0或index, 删除列-1或columns, 默认0 inplace: True或False, 是否在原数据上删除, 默认False # 删除一行数据, 原df上并没有删除
print(temp_df.drop(labels[0]))
# 删除多行数据, 原df上删除
temp_df.drop(labels[0, 2, 4], axisindex, inplaceTrue)
print(temp_df)
# 删除一列数据, 原df上并没有删除
print(temp_df.drop(labels[新价格], axis1))
# 删除多列数据, 原df上删除
temp_df.drop(labels[新价格, 区县, 省份], axiscolumns, inplaceTrue)
print(temp_df)
# 输出结果如下区域 地址 户型 面积 价格 ... 更新时间 看房人数 省份 区县 新价格
1 望京租房 澳洲康都 2室1厅 79 7800 ... 2017.07.23 33 北京 朝阳区 8800
2 广安门租房 远见名苑 2室1厅 86 8000 ... 2017.07.20 34 北京 西城区 9000
3 天通苑租房 天通苑北一区 2室1厅 103 5300 ... 2017.07.25 30 北京 昌平区 6300
4 团结湖租房 团结湖北口 2室1厅 63 6400 ... 2017.07.26 30 北京 朝阳区 7400
[4 rows x 11 columns]区域 地址 户型 面积 价格 ... 更新时间 看房人数 省份 区县 新价格
1 望京租房 澳洲康都 2室1厅 79 7800 ... 2017.07.23 33 北京 朝阳区 8800
3 天通苑租房 天通苑北一区 2室1厅 103 5300 ... 2017.07.25 30 北京 昌平区 6300
[2 rows x 11 columns]区域 地址 户型 面积 价格 朝向 更新时间 看房人数 省份 区县
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33 北京 朝阳区
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30 北京 昌平区区域 地址 户型 面积 价格 朝向 更新时间 看房人数
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
3 Series或DataFrame数据去重 通过 s/df.drop_duplicates(subset,keep,inplace) 方法对数据去重 subset: df的参数, 传入列名列表, 对指定列进行去重, 不写此参数默认对所有列进行去重 keep: 保留哪条重复数据, first-保留第一条, last-保留最后一条, False-都不保留, 默认first inplace: True或False, 是否在原数据上去重, 默认False DataFrame数据去重 duplicates temp_df df.head().copy()
# 对df所有列去重, 当前df没有重复的行数据
print(temp_df.drop_duplicates())
# 根据指定列对df去重, 默认保留第一条数据
# 第1行和第5行、第2行和第3行重复
print(temp_df.drop_duplicates(subset[户型, 朝向]))
# 保留最后一条数据
# print(temp_df.drop_duplicates(subset[户型, 朝向], keeplast))
# 重复数据都不保留
# print(temp_df.drop_duplicates(subset[户型, 朝向], keepFalse))
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30 Series数据去重 print(-------------去重之后返回Series对象--------------------)
# 默认保留第一条数据
print(temp_df[朝向].drop_duplicates())
# 保留最后一条数据
print(temp_df[朝向].drop_duplicates(keeplast))
# 重复数据都不保留
print(temp_df[朝向].drop_duplicates(keepFalse))
print(-------------去重之后返回数组--------------------)
# series对象还可以使用unique函数去重, 返回ndarray数组
print(temp_df[朝向].unique())
# nunique函数实现去重计数操作, 类似 count(distinct)
print(temp_df[朝向].nunique())
# 输出结果如下
0 南
1 东
3 东南
Name: 朝向, dtype: object
2 东
3 东南
4 南
Name: 朝向, dtype: object
3 东南
Name: 朝向, dtype: object
[南 东 东南]
3
4 Series或DataFrame数据修改
4.1 直接修改数据 通过 df[列名]新值 或 s[行索引]新值 修改数据 # 获取前5条数据并复制一份
temp_df df.head().copy()
# 获取价格列, 得到series对象, 复制一份数据
s1 temp_df[价格].copy()
print(s1)
# series修改数据
s1[0] 7000
print(s1)
# dataframe修改数据, 列表数据数量要和行数相等
temp_df[价格] [6800, 8800, 9000, 6300, 6400]
print(temp_df)
# 输出结果如下
0 5800
1 7800
2 8000
3 5300
4 6400
Name: 价格, dtype: int64
0 7000
1 7800
2 8000
3 5300
4 6400
Name: 价格, dtype: int64区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 6800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 8800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 9000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 6300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
4.2 replace函数替换数据 通过 s/df.replace(to_replace, value, inplace) 方法替换数据 to_replace: 需要替换的数据 value: 替换后的数据 inplace: True或False, 是否在原数据上替换, 默认False # 获取前5条数据并复制一份
temp_df df.head().copy()
# 替换series的数据
print(temp_df[价格].replace(to_replace5300, value6000))
temp_df[朝向].replace(东南, 西, inplaceTrue)
print(temp_df)
# 替换dataframe的数据
print(temp_df.replace(to_replace2室1厅, value3室2厅))
# 输出结果如下
0 5800
1 7800
2 8000
3 6000
4 6400
Name: 价格, dtype: int64区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 西 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 3室2厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 3室2厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 3室2厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 3室2厅 103 5300 西 2017.07.25 30
4 团结湖租房 团结湖北口 3室2厅 63 6400 南 2017.07.26 30
4.3执行自定义函数修改数据 有时需要我们对df或s对象中的数据做更加精细化的修改动作并将修改操作封装成为一个自定义的函数这时我们就可以利用s/df.apply(函数名)来调用我们自定义的函数 s或df对象可以借助apply函数执行自定义函数, 内置函数无法处理需求时就需要使用自定义函数来处理 4.3.1s.apply()函数遍历每一个值同时执行自定义函数 Series对象使用apply调用自定义的函数返回新的Series对象 # 加载数据集
df pd.read_csv(../data/LJdata.csv)
# 获取前5条数据并复制一份
temp_df df.head().copy()
# 自定义函数, 最少接收一个参数
def func(x):# x此时是s对象中一个数据值燕莎租房、望京租房print(x的值是-, x)# 本自定义函数返回的也是一个数据if x 天通苑租房:return 昌平区return x
temp_df[区域] temp_df[区域].apply(func)
print(temp_df)
# 输出结果如下
x的值是- 燕莎租房
x的值是- 望京租房
x的值是- 广安门租房
x的值是- 天通苑租房
x的值是- 团结湖租房区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 昌平区 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30 Series对象使用apply调用自定义的函数并向自定义函数中传入其他参数 # 获取前5条数据
temp_df df.head().copy()
# 自定义函数, 最少接收一个参数
def func(x, arg1, arg2):# x此时是s对象中一个数据print(x的值是-, x)# 本自定义函数返回的也是一个数据if x 天通苑租房:return arg1return arg2
# args: 传入其他参数值, 元组类型
temp_df[区域] temp_df[区域].apply(func, args(昌平区, 其他区))
# apply中其他参数名和自定义函数中其他形参名相同
# temp_df[区域] temp_df[区域].apply(func1, arg1昌平区, arg2其他区)
print(temp_df)
# 输出结果如下
x的值是- 燕莎租房
x的值是- 望京租房
x的值是- 广安门租房
x的值是- 天通苑租房
x的值是- 团结湖租房区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 其他区 新源街 2室1厅 50 5800 南 2017.07.21 26
1 其他区 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 其他区 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 昌平区 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 其他区 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
4.3.2 df.apply()函数遍历每一行/列同时执行自定义函数
# 获取前5条数据
temp_df df.head().copy()
print(temp_df)
def func1(s, arg1):# 此时s参数就是df中的一列数据, s对象# print(s的值是-, s)# print(s的类型是-, type(s))# 本自定义函数也必须返回一列数据, s对象# print(s.__dict__)if s._name 价格:return s arg1else:return s
# 默认遍历df每列, axis0
print(temp_df.apply(func1, args(1000,), axis0))
def func2(s, arg1):# 此时s参数就是df中的一行数据, s对象# print(s的值是-, s)# print(s的类型是-, type(s))# 本自定义函数也必须返回一列数据, s对象# print(s.__dict__)if s[区域] 天通苑租房:# 修改价格对应的值s[价格] s[价格] arg1return selse:return s
# 遍历df每行, axis1
print(temp_df.apply(func2, arg11000, axis1))
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 6800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 8800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 9000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 6300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 7400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 6300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30
4.3.3 df.applymap()函数遍历每一个值同时执行自定义函数
# 获取前5条数据
temp_df df.head().copy()
print(temp_df)
# 自定义函数只能接收一个参数
def func(x):# 此时x参数就是df中的每个数据# print(x的值是-, x)# 本自定义函数也必须返回一个数据if x 2室1厅:return 3室2厅else:return x
print(temp_df.applymap(func))
# 输出结果如下区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 2室1厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 2室1厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 2室1厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 2室1厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 2室1厅 63 6400 南 2017.07.26 30区域 地址 户型 面积 价格 朝向 更新时间 看房人数
0 燕莎租房 新源街 3室2厅 50 5800 南 2017.07.21 26
1 望京租房 澳洲康都 3室2厅 79 7800 东 2017.07.23 33
2 广安门租房 远见名苑 3室2厅 86 8000 东 2017.07.20 34
3 天通苑租房 天通苑北一区 3室2厅 103 5300 东南 2017.07.25 30
4 团结湖租房 团结湖北口 3室2厅 63 6400 南 2017.07.26 30 总结 请对下列API 有印象、能找到、能理解、能看懂 df[列名] 标量或向量 修改或添加列 df.insert(列下标数字, 列名, 该列所有值) 指定位置添加列 df/s.drop([索引值1, 索引值2, ...]) 根据索引删除行数据 df.drop([列名1, 列名2, ...], axis1) 根据列名删除列数据 df/s.drop_duplicates() df或s对象去除重复的行数据 s.unique() s对象去除重复的数据 df/s.replace(原数据, 新数据, inplaceTrue) 替换数据 df或series对象替换数据返回的还是原来相同类型的对象不会对原来的df造成修改 如果加上inplaceTrue参数则会修改原始df apply函数 s.apply(自定义函数名, arg1xx, ...) 对s对象中的每一个值都执行自定义函数且该自定义函数除了固定接收每一个值作为第一参数以外还可以接收其他自定义参数 df.apply(自定义函数名, arg1xx, ...) 对df对象中的每一列都执行自定义函数且该自定义函数除了固定接收列对象作为第一参数以外还可以接收其他自定义参数 df.apply(自定义函数名, arg1xx, ..., axis1) 对df对象中的每一行都执行自定义函数且该自定义函数除了固定接收行对象作为第一参数以外还可以接收其他自定义参数 applymap函数 df.applymap(自定义函数名) 对df对象中的每个值, 都执行自定义函数, 且该自定义函数只能接收每个值作为参数, 不能接收其他自定义参数