Python | 记录最近遇到的大坑!
目录
- 1 如何判断一个多维数组是否某一行全大于另外几行?
- 1.1 数据
- 1.2 需求
- 2 Python相比SQL优势
- 3 遇到的大坑!
- 3.1 导入数据
- 3.2 需求
- 3.3 新需求
- 3.4 那么坑在哪里?
- 4 数据
最近在实习,用的编程语言都是Python,记录一下在具体的业务场景下使用Python时遇到的一些很好用的函数以及遇到的大坑!(含泪debug 太伤了–|)
如何判断一个多维数组是否某一行全大于另外几行?
数据
import numpy as np
centroid = np.array([[0.93817355, 0.72219008, 0.87606612],[0.94956682, 0.66898157, 0.60680184],[0.6135 , 0.6666 , 0.72787 ]])
centroid
array([[0.93817355, 0.72219008, 0.87606612],[0.94956682, 0.66898157, 0.60680184],[0.6135 , 0.6666 , 0.72787 ]])
需求
如果上述结果为聚类中心的结果(分为三类),如何判断聚类的有效性呢?我们认为如果某一个聚类中心的每一个维度的值都大于另外的聚类中心对应的值,那么这次聚类就是有效的!
核心问题来了?如何判断呢?如果仅仅是二维的,直接判断就好了 if 啥的 但是3 * 3 的就不好办了!
不要怕!numpy中有个很好用的函数! where函数!
c1 = np.where(centroid == np.max(centroid, axis=0)) # 每一列的最大值
print(c1)
c2 = c1[0]
print(c2)
if c2[0] == c2[1] == c2[2] :print('此次聚类结果有效!!!鼓掌!撒花!')
else:print('此次聚类结果无效!!!')
(array([0, 0, 1]), array([1, 2, 0]))
[0 0 1]
此次聚类结果无效!!!
centroid2 = np.array([[0.94020979,0.69494406, 0.81282517],[0.60467857, 0.65509821, 0.69383036],[0.93487778, 0.61891111, 0.59659444]])
centroid2
array([[0.94020979, 0.69494406, 0.81282517],[0.60467857, 0.65509821, 0.69383036],[0.93487778, 0.61891111, 0.59659444]])
c1 = np.where(centroid2 == np.max(centroid2, axis=0)) # 每一列的最大值 所在第几行的数组!
print(c1)
c2 = c1[0]
print(c2) # 说明三列的最大值都在第一行!
if c2[0] == c2[1] == c2[2] :print('此次聚类结果有效!!!鼓掌!撒花!')
else:print('此次聚类结果无效!!!')
(array([0, 0, 0]), array([0, 1, 2]))
[0 0 0]
此次聚类结果有效!!!鼓掌!撒花!
Python相比SQL优势
- SQL无法对多维数组进行筛选
- Python处理多维数组的筛选毫无压力!见下例
遇到的大坑!
- 在windows下用pandas读入数据的时候不要在文件名中包含中文名称!否则会报错 OSError: Initializing from file failed
- 在对字符串处理的时候,如果发现自己逻辑思路代码啥的全都没问题,但还是报错,与自己想的不一样,这时候就考虑是否有**空格!!!!空格!!!!**卧槽!上次groupby少了数据也是因为存在空格 所以类别就会不一样 不是一类的!
def Filid(df, label):s1 = str(label)s2 = s1.replace("'", '"').replace(",", ",").replace(" ","")df_1 = df[df['interests_array'] == s2]df_1.to_csv('./data/[%d]_%s_%s.csv' % (df_1.shape[0], label[0], label[1]),index=False, encoding='gbk')
- 上述函数为啥要定义?定义的背景是什么呢?我们来好好说一说!
导入数据
import pandas as pd
df_test = pd.read_csv('../example_data.csv', encoding='gbk')
print(df_test.shape)
df_test.head()
(774, 2)
interests_array | device_uuid | |
---|---|---|
0 | ["高考","两性","互联网","美女"] | CQk5NDZiMjM1NGVmMjQyZTAyCTNIWDAyMTcxMTcwMDI4ND... |
1 | ["高考","两性","养生","医疗"] | a0000059cb1d20 |
2 | ["高考","两性","医疗","房产"] | CQk5NzFlYWI2ZWZhNzRhYTAJM0hYMDIxNzgxMDAwNjIxMA... |
3 | ["高考","两性","古代史"] | 7D665A51-DD3D-4231-BE82-2A21D5A31D60 |
4 | ["高考","两性","教育","育儿"] | 4EB70A7C-3DA9-4B76-9710-FE1C50552E7B |
df_test_list = df_test['interests_array'].value_counts()[:5].index.tolist()
df_test_list
['["高考","高校"]','["高考","中小学教育"]','["高考","国际足球"]','["高考","购房"]','["高考","养生"]']
需求
- 现在想要把[“高考”,“高校”]的id全部筛选出来
# 轻松实现!
df_test[df_test['interests_array'] == '["高考","高校"]'].head()
interests_array | device_uuid | |
---|---|---|
554 | ["高考","高校"] | 014C4B39-8B4F-4E24-87BD-C8006A8CF989 |
555 | ["高考","高校"] | 1E62BEB3-1F23-459B-ACA1-ACEA6BD9E352 |
556 | ["高考","高校"] | 28BBAE46-8EEC-4B22-9C36-8C1CBC4F9A47 |
557 | ["高考","高校"] | 293CB176-C76C-4028-AA0B-2053E6AFBF25 |
558 | ["高考","高校"] | 2CB42104-BCB4-41E0-BC28-E201FE4671ED |
新需求
现在想要去批量的做这件事情(有很多label的需求),也就是把这个写成一个函数,并且输出相应的csv文件,方便策略上线
def Filid(df, label):df_1 = df[df['interests_array'] == label]print(df_1.shape)df_1.to_csv('[%d]_%s_%s.csv' % (df_1.shape[0], label[0], label[1]),index=False, encoding='gbk')
- 现在假设我们要考虑的label有:
df_test_list
['["高考","高校"]','["高考","中小学教育"]','["高考","国际足球"]','["高考","购房"]','["高考","养生"]']
df_test_list[4]
'["高考","养生"]'
for i in range(len(df_test_list)):Filid(df_test, df_test_list[i])
(65, 2)
(13, 2)
(10, 2)
(9, 2)
(9, 2)
输出的文件截图如下图所示:
咦 为啥是4个文件呢?为啥不是5个呢?因为有两个输出都是9 * 2 的,所以重复了!这个明显有bug 得修改函数,让文件取名更加合理!
def Filid2(df, label):df_1 = df[df['interests_array'] == label]print(df_1.shape)df_1.to_csv('[%d]_%s_%s.csv' % (df_1.shape[0], eval(label)[0], eval(label)[1]),index=False, encoding='gbk')
for i in range(len(df_test_list)):Filid2(df_test, df_test_list[i])
(65, 2)
(13, 2)
(10, 2)
(9, 2)
(9, 2)
问题解决!
那么坑在哪里?
可能大家觉得,诶,上面的工作不是很容易吗?哪里有坑了?客观不要急!
坑是这样的,下午这边leader给我的数据并不是上面统计频数之后的label列表啊,而是Excel里的!下面给出!
all_list = [["高考","高校"]
,["高考","中小学教育"]
,["高考","购房"]
,["高考","国际足球"]
,["高考","养生"]
]
all_list
[['高考', '高校'], ['高考', '中小学教育'], ['高考', '购房'], ['高考', '国际足球'], ['高考', '养生']]
all_list[0]
['高考', '高校']
print(all_list[0])
Filid(df_test, all_list[0])
['高考', '高校']---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-51-fd5af72927ba> in <module>()1 print(all_list[0])
----> 2 Filid(df_test, all_list[0])<ipython-input-34-4bc0ca4b91e4> in Filid(df, label)1 def Filid(df, label):
----> 2 df_1 = df[df['interests_array'] == label]3 print(df_1.shape)4 df_1.to_csv('[%d]_%s_%s.csv' % (df_1.shape[0], label[0], label[1]),5 index=False, encoding='gbk')~/anaconda3/lib/python3.6/site-packages/pandas/core/ops.py in wrapper(self, other, axis)1281 1282 with np.errstate(all='ignore'):
-> 1283 res = na_op(values, other)1284 if is_scalar(res):1285 raise TypeError('Could not compare {typ} type with Series'~/anaconda3/lib/python3.6/site-packages/pandas/core/ops.py in na_op(x, y)1141 1142 elif is_object_dtype(x.dtype):
-> 1143 result = _comp_method_OBJECT_ARRAY(op, x, y)1144 1145 elif is_datetimelike_v_numeric(x, y):~/anaconda3/lib/python3.6/site-packages/pandas/core/ops.py in _comp_method_OBJECT_ARRAY(op, x, y)1118 y = y.values1119
-> 1120 result = libops.vec_compare(x, y, op)1121 else:1122 result = libops.scalar_compare(x, y, op)pandas/_libs/ops.pyx in pandas._libs.ops.vec_compare()ValueError: Arrays were different lengths: 774 vs 2
你看!报错了!
主要原因是:
- 直接输入all_list[0]是 [‘高考’, ‘高校’] 而不是与原来数据框一致的 ‘[“高考”, “高校”]’
- 怎么办呢?
- 首先将单引号replace成双引号,然后还有一个坑就是逗号的问题!逗号也得保持一致!中文状态下和英文状态下不一样!最后,究极大坑来了!!!空格一定记得也得给去掉!!!空格!!!感谢leader杨哥!一下子就发现了问题!牛逼!
def Filid_plus(df, label):s1 = str(label)s2 = s1.replace("'", '"').replace(",", ",").replace(" ","")df_1 = df[df['interests_array'] == s2]df_1.to_csv('./data/[%d]_%s_%s.csv' % (df_1.shape[0], label[0], label[1]),index=False, encoding='gbk')
for i in range(len(all_list)):Filid_plus(df_test, all_list[i])
没问题了!棒棒哒!!!
今天的分享就到这!想要自己手动实现的可以下载下面的数据集试一试!晚安!
数据
- example_data: https://pan.baidu.com/s/1jApSNlAnYQaaA1cK2Dq3MQ
Python | 记录最近遇到的大坑!相关推荐
- python记录当前系统时间 生成照片直接命名
python记录当前系统时间: import datetimecurr_time = datetime.datetime.now() print(str(curr_time.year)+". ...
- python获取pid并杀死_用python记录运行pid,并在需要时kill掉它们的实例
我在跑爬虫程序的时候,由于爬虫程序的等待目标服务器返回数据的时间很长,而cpu占用很低,所以经常挂着代理一跑就跑好几百个.但是爬虫程序通常是写了死循环,或直到分配给该进程的任务都跑完才退出的.如果我们 ...
- python执行时间长被kill_用python记录运行pid,并在需要时kill掉它们的实例
我在跑爬虫程序的时候,由于爬虫程序的等待目标服务器返回数据的时间很长,而cpu占用很低,所以经常挂着代理一跑就跑好几百个.但是爬虫程序通常是写了死循环,或直到分配给该进程的任务都跑完才退出的.如果我们 ...
- Python记录程序运行的时间
Python记录程序运行的时间 内置模块time包含很多与时间相关函数.我们可通过它获得当前的时间和格式化时间输出. import timestart = time.clock()#当中是你的程序el ...
- python记录程序运行时间的三种方法
这里提供了python记录程序运行时间的三种方法,并附有实现代码,最后进行比较,大家参考下: 方法1 import datetime starttime = datetime.datetime.now ...
- python自动记录时间_如何使用python记录室友的抖音在线时间
今天给大家分享一篇有趣的文章,灵感来自于前几天与室友的聊天,他告诉我抖音可以实时显示人的在线情况,如下图: 只需要进入抖音消息框,然后进入用户聊天窗口,就可以看到上述在线状态了. 然后我灵机一动,是不 ...
- python服务器查看文件更改记录,Python记录到同一文件,不同用户
我正在使用python的日志记录模块. 对于单元测试(每次使用py.test),每次启动测试时,一些日志信息都会进入某个文件.在集成服务器中,每当有人推送代码时(我们也使用git :),我们都会运行测 ...
- Python练习题——初学Python记录
前言 自学python差不多两个星期了,找点题目练练手顺便记录一下,希望大佬们多多指点 题目 1 判断一个整形数是否为回文数 回文数定义即为数字翻转后仍为原来的数字 因为在学校学过c++,所以这类题型 ...
- python记录鼠标键盘操作自动执行重复工作
系列文章目录 文章目录 系列文章目录 前言 github项目原地址 一.执行方法 二.python录制 1.Frame1.py 2.KeymouseGo.py 三.说明书 KeymouseGo v2. ...
最新文章
- 使用 Vagrant 在不同的操作系统上测试你的脚本
- 初学编程的小白 | 每日趣闻
- javascript数据类型和常用内置对象(重要!)
- Java排序算法之归并排序
- 词云图可视化python_python 可视化 词云图
- JavaWeb的一些理解
- git add . 出现错误 The file will have its original line endings in your working directory. 解决方案...
- MySQL数据库基础(五)——SQL查询
- PYTHON得到pdf页数、遍历当前文件夹
- 小白也可以玩转的炫酷大屏!
- 关于new 和delete的灾祸
- c 宏变量/宏函数/log
- 第14章 学习scikit-learn文档
- 用c语言编写金山打字游戏,c#实现简单金山打字小游戏(源码)
- rand()和srand()GetTickCount函数用法
- c语言背包问题(动态规划解法)
- 一个VC编写的虚拟桌面软件
- win10系统点电脑无线图标没反应的,点设置里的显示可用网络没反应
- 火影Vulcan笔记本金钢T1安装Win7系统图文教程
- 赛效:如何在线更改图片格式 图片格式在线转换方法介绍