pandas的下载
使用命令下载:
pip install pandas
或者自行下载whl文件安装
https://www.lfd.uci.edu/~gohlke/pythonlibs/
创建DataFrame数据
pd_data = pd.DataFrame({ \"name\":[\"小明\",\"小红\",\"小孙\",\"王小\",\"关宇\",\"刘蓓\",\"张菲\"], \"age\":[20,18,27,20,28,18,25], \"sex\":[\"男\",\"女\",\"男\",\"男\",\"男\",\"女\",\"女\"], \"score\":[669,570,642,590,601,619,701], \"address\":[\"北京\",\"深圳\",\"广州\",\"武汉\",\"深圳\",\"广州\",\"长沙\"] }) print(pd_data)
读取本地文件
pd_data = pd.read_excel(\'./测试.xlsx\') pd.set_option(\'display.max_columns\', None) # 显示完整的列 pd.set_option(\'display.max_rows\', None) # 显示完整的行 pd.set_option(\'display.expand_frame_repr\', False) # 设置不折叠数据 print(pd_data)
查看数据是否有缺失
# 如果缺失显示为True,否则显示False isnull = pd_data.isnull() print(isnull)
统计缺失值个数
# 统计缺失值个数 null_count = pd_data.isnull().sum() print(null_count)
缺失值填充
# 填充数据 我选择了8.888,你随意 pd_data.fillna(8.888, inplace=True) print(pd_data)
缺失值删除
# 如果有缺失值,删除此行 exist_col = pd_data.dropna() print(exist_col)
查看头尾文件
# 查看头尾文件 print(\'头文件:\', pd_data.head()) print(\'尾文件:\', pd_data.tail())
取单列值
# 单列值 pd_data = pd.read_excel(\'./测试.xlsx\') print(pd_data[\'全款价\'])
取多列值
# 多列值 pd_data = pd.read_excel(\'./测试.xlsx\') print(pd_data[[\'车辆概况\', \'全款价\']])
单条件取值
pd_data = pd.read_excel(\'./测试.xlsx\') print(pd_data[pd_data[\'全款价\'] == 4]) print(\'-\'*100) print(pd_data[pd_data[\'汽车排量\'] == \'2.0T\'])
多条件取值-与
# 多条件筛选数据 print(pd_data[(pd_data[\'车龄\'] == \'2018年\') & (pd_data[\'变速箱\'] == \'自动\')])
多条件取值-或
# 多条件筛选数据 print(pd_data[(pd_data[\'车龄\'] == \'2018年\') | (pd_data[\'变速箱\'] == \'自动\')])
字符串的开始函数
# 找出在 车辆概况 中以\'大众\'开头的 cars = pd_data[pd_data[\'车辆概况\'].str.startswith(\'大众\')] print(cars)
字符串的结尾函数
# 找出在 车辆概况 中以\'豪华型\'结尾的 cars = pd_data[pd_data[\'车辆概况\'].str.endswith(\'豪华型\')] print(cars)
字符串的包含函数
# 找出在 车辆概况 中包含\'进口\'的 cars = pd_data[pd_data[\'车辆概况\'].str.contains(\'进口\')] print(cars)
统计元素个数
# 统计 过户分类 以及对应次数 trans_count = pd_data[\'过户情况\'].value_counts() print(trans_count)
为了便于进一步的数据分析,我希望将它们置于不同的数组之中,可以采用如下方法:
# 统计 过户分类 以及对应次数 trans_count = pd_data[\'过户情况\'].value_counts() # 针对于过户情况的分类 x1_data = trans_count.index.tolist() # 分类后各组数据的统计 x2_data = trans_count.tolist() print(x1_data) print(x2_data)
这种格式的数据才是最适合做可视化分析的!
这里再多介绍两种方法,条条大路通罗马
都能轻松实现你的目标。
# 统计 过户分类 以及对应次数 trans_count = pd_data[\'过户情况\'].value_counts() # 针对于过户情况的分类 x1_data = trans_count.index.tolist() x11_data = trans_count.index x12_data = trans_count.index.values # 类后各组数据的统计 x2_data = trans_count.tolist() print(\'index.tolist():\', x1_data) print(\'index:\', x11_data) print(\'index.values:\', x12_data) print(\'x2:\', x2_data)
分割字符串
这个功能也很实用,大家可以看看我的汽车名称数据这一列,我的目标仅仅是车名而已,后面的车型、车龄、排列、变速箱信息对我来说都是冗余信息。
非常不利于我后续数据可视化
所以字符串分割在这里就显得尤为重要。
# 对 汽车名称 这一列按照空格分割 并取第一个字符 pd_data[\'汽车名称\'] = pd_data[\'车辆概况\'].map(lambda x: x.split(\" \")[0]) name = pd_data[\'汽车名称\'].value_counts() # 汽车名称分类 name1 = name.index.tolist() # 汽车名称对应数量 name2 = name.tolist() print(name1) print(name2)
看到我取出来数据的样子了吗,要的就是这个!
清理数据
当我们相对汽车里程做进一步的分析时会发现数据后面都有一个’万公里’,这种数据要做可视化必须先对数据进行处理,
就是先要去除数字后面的字符
我们可以使用字符串的replace()方法,使用空格替换字符
pd_data.loc[:, \'表显里程new\'] = pd_data[\'表显里程\'].str.replace(\'万公里\', \'\').astype(\'float32\') # 去除 30 ’万公里‘ # 保存数据 pd_data.to_excel(\'测试1.xlsx\')
黄色一列是我们处理之前的数据
绿色一列是我们处理之后的数据
已经达到了我们想要的效果
划分区间
现在有这么一个需求,我想要按照汽车的行驶里程分类,基本上每个车的行驶里程都是不一样的,如果将每个数据都反映在图标上就会看起来很冗余,
也就失去了作图的意义
所以我们可以按照区间来划分,例如5w-10w公里、10w-15w公里这样图表展示展示出来的效果就会很好了。
pd_data.loc[:, \'表显里程new\'] = pd_data[\'表显里程\'].str.replace(\'万公里\', \'\').astype(\'float32\') # 去除 30 ’万公里‘ # 划分区间 pd_data[\'里程区间\'] = pd.cut(pd_data[\'表显里程new\'], [0, 2, 4, 6, 8, 10, 20], labels=[\'0-2\', \'2-4\', \'4-6\', \'6-8\', \'8-10\', \'>10\']) mile = pd_data[\'里程区间\'].value_counts() mile1 = mile.index.tolist() # 里程区间分类 mile2 = mile.tolist() # 里程区间分类对应数量 print(mile1) print(mile2)
重置索引
其实我们在上面案例的演示中已经发现了,根据条件取出来的数据的索引都是处理数据之前的索引,
我们现在要重置索引的话要怎么办呢?
我们可是使用_reset_index()_来索引重置
重置索引前:
# 找出在 过户情况 中所有\'0次\'的汽车 cars = pd_data[pd_data[\'过户情况\'].str.contains(\'0次\')] print(cars.reset_index())
重置索引后:
很好,但是不完美。多了一列colm name叫做 index的先前序列号。
不想看到它,有办法吗?
drop = True
# 找出在 过户情况 中所有\'0次\'的汽车 cars = pd_data[pd_data[\'过户情况\'].str.contains(\'0次\')] print(cars.reset_index(drop=True))
column重命名
# 重命名 pd_data = pd_data.rename(columns = {\'车辆概况\':\'车辆详情\'}) print(pd_data)
分组统计groupby-单条件
# 统计不同变速箱总里程 pd_data.loc[:, \'表显里程new\'] = pd_data[\'表显里程\'].str.replace(\'万公里\', \'\').astype(\'float32\') # 去除 30 ’万公里‘ trans_mile = pd_data.groupby(\'变速箱\')[\'表显里程new\'].sum() print(trans_mile)
分组统计groupby-多条件
# 统计不同变速箱和过户情况总里程 pd_data.loc[:, \'表显里程new\'] = pd_data[\'表显里程\'].str.replace(\'万公里\', \'\').astype(\'float32\') # 去除 30 ’万公里‘ trans_mile = pd_data.groupby([\'变速箱\',\'过户情况\'])[\'表显里程new\'].sum() print(trans_mile)
如果再加上一个重置索引 trans_mile.reset_index()
求平均
# 统计不同过户次数车辆平均里程 pd_data.loc[:, \'表显里程new\'] = pd_data[\'表显里程\'].str.replace(\'万公里\', \'\').astype(\'float32\') # 去除 30 ’万公里‘ trans_mile = pd_data.groupby(\'过户情况\')[\'表显里程new\'].mean() print(trans_mile.reset_index())
apply函数
还记得我们爬取大学的那个教程吗?
我们爬出来的数据如果是985或者是211显示为1,
如果非985或者211,显示为2
现在我不想要1和2了,因为我看不懂它是什么意思?如果是985或者211,就显示是,如果不是,就显示否!
pd_data = pd.read_excel(\'./全国高校数据.xlsx\') print(pd_data) pd_data1 = pd_data.copy() # 生成一个副本, 防止数据损坏 pd_data[\'f985\'] = pd_data[\'f985\'].apply(lambda x: \'是\' if x == 1 else \'否\') # 通过匿名函数解决 pd_data[\'f211\'] = pd_data[\'f985\'].apply(lambda x: \'是\' if x == 1 else \'否\') # 通过匿名函数解决 print(pd_data)
同理利用_lambda_函数我们还可以
给省份这一列后面加个’省’
pd_data = pd.read_excel(\'./全国高校数据.xlsx\') print(pd_data) pd_data1 = pd_data.copy() # 生成一个副本, 防止数据损坏 pd_data[\'province_name\'] = pd_data[\'province_name\'].apply(lambda x: x+\'省\') # 通过匿名函数解决 print(pd_data) \'\'\'
同理利用_lambda_函数我们还可以给
人气值view_total这一列最后面的’w’
pd_data[\'view_total\'] = pd_data[\'view_total\'].apply(lambda x: x[:-1]) # 通过匿名函数解决 print(pd_data)
求最大最小值
max_view_total = pd_data[pd_data[\'view_total\'] == pd_data[\'view_total\'].max()] print(max_view_total)
min_view_total = pd_data[pd_data[\'view_total\'] == pd_data[\'view_total\'].min()] print(min_view_total)
时间提取
为了便于演示,我加上了一列 Date 选项,如下:
现在我们想提取其中的年份或者月份,我们可以使用 \'DatetimeIndex’这个方法来实现。
pd_data = pd.read_excel(\'./全国高校数据.xlsx\') pd_data[\'year\'] = pd.DatetimeIndex(pd_data[\'Date\']).year pd_data[\'month\'] = pd.DatetimeIndex(pd_data[\'Date\']).month pd_data[\'day\'] = pd.DatetimeIndex(pd_data[\'Date\']).day print(pd_data)
增加列
我想把刚才的生成的年+月+日方法到前三列,可以使用insert()方法来实现
Year = pd.DatetimeIndex(pd_data[\'Date\']).year Month = pd.DatetimeIndex(pd_data[\'Date\']).month day = pd.DatetimeIndex(pd_data[\'Date\']).day pd_data.insert(0, \'Year\', Year) pd_data.insert(1, \'Month\', Month) pd_data.insert(2, \'day\', day) print(pd_data)
来源:https://www.cnblogs.com/liuyebai/p/16806721.html
本站部分图文来源于网络,如有侵权请联系删除。