[364 楼] 手倦抛书
[泡菜]
22-3-9 06:02
yejun 发表于 2022-03-06 10:57用selenium。
本帖最后由 yejun 于 2022-3-6 11:07 编辑 嗯,太慢了,爬虫学点就行了,量化才是王道 发布自 安卓客户端
|
[363 楼] 午夜半杯茶
[泡菜]
22-3-6 14:21
从没学过编程的学Python难吗,只学关于电子表格处理的部分。 发布自 色影无忌小程序
|
[362 楼] 碧桂老鱼
[资深泡菜]
22-3-6 11:00
好帖子,标记收藏。我不是相关专业的,看了入门的书,觉得这个语言有点太灵活了,有兴趣啊。 发布自 安卓客户端
|
[361 楼] yejun
[老坛泡菜]
22-3-6 10:57
手倦抛书 发表于 2022-3-6 09:33  学了一个月爬虫,一般网页没啥问题了,但碰上全js网站就抓瞎了,逆向js太难了,看见那密密麻麻的js代码就头大 用selenium。 https://selenium-python-zh.readthedocs.io/en/latest/ 本帖最后由 yejun 于 2022-3-6 11:07 编辑
|
[360 楼] 手倦抛书
[泡菜]
22-3-6 09:33
学了一个月爬虫,一般网页没啥问题了,但碰上全js网站就抓瞎了,逆向js太难了,看见那密密麻麻的js代码就头大 发布自 安卓客户端
|
[359 楼] yejun
[老坛泡菜]
21-9-26 12:17
大信 发表于 2021-9-26 10:42  不是我坚持用for循环,我以为此例只能用 self.dfx.loc[index,....] 而不能用 self.dfx.loc[条件表达式,.....]
当然你用的 index 其实也是一个条件表达式。这种写法我是头一次见到,学习了! 另外纠正一个小小错误,index赋值应该为: index = self.dfx["rate"] 其实那个不等试已经是一个布尔序列了。你打印一下index就明白了。 我写python一般会在VSCode里面开一个jupyter窗口边试边写,所有变量一目了然。
|
[358 楼] 天放
[资深泡菜]
21-9-26 10:44
|
[357 楼] 大信
[泡菜]
21-9-26 10:42
yejun 发表于 2021-9-24 10:27  那个警告就是将来的版本不支持的,我的python版本就直接出错了。 和你说了很多次了不要用for循环,效率低几十倍呢,因为pandas内部的循环是c写的。 这样写吧 index = row["rate"]< 70: self.dfx.loc[index, "type"] = 3 self.dfx.loc[index,"score2"] = self.dfx["score1"] 不是我坚持用for循环,我以为此例只能用 self.dfx.loc[index,....] 而不能用 self.dfx.loc[条件表达式,.....] 当然你用的 index 其实也是一个条件表达式。这种写法我是头一次见到,学习了! 另外纠正一个小小错误,index赋值应该为: index = self.dfx["rate"]<70 本帖最后由 大信 于 2021-9-26 10:43 编辑
|
[356 楼] 大信
[泡菜]
21-9-26 10:33
|
[355 楼] 手倦抛书
[泡菜]
21-9-24 20:05
最近学习pandas,兼职给财务和业务部门做码农,快50的人了,废寝忘食,乐不思蜀,哈哈 发布自 安卓客户端
|
[354 楼] yejun
[老坛泡菜]
21-9-24 10:27
大信 发表于 2021-9-24 10:18  非常感谢,解释得比较清楚了。我后来改为一次赋值一列,就没有问题。
针对这个问题,我发现更改数据的时候不用loc加条件赋值,而是采用dfx.loc[index,.....]的方式,也可以多列同时赋值。例如下面这样修改,就不会出现Nan值:
for index,row in self.dfx.iterrows(): if row["rate"]< 70: self.dfx.loc[index, ["type", "score2"]] = [3, self.dfx["score1"]]
虽然赋值成功,但是仍然会出现告警:
C:\Users\test\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\fromnumeric.py:3162: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. return asarray(a).ndim
我想问的是,这个告警如果不管它,会不会有什么隐患?
最后,我再改为分别赋值,就彻底没这个问题了:
for index,row in self.dfx.iterrows(): 那个警告就是将来的版本不支持的,我的python版本就直接出错了。 和你说了很多次了不要用for循环,效率低几十倍呢,因为pandas内部的循环是c写的。 这样写吧 index = row["rate"]< 70: self.dfx.loc[index, "type"] = 3 self.dfx.loc[index,"score2"] = self.dfx["score1"] 本帖最后由 yejun 于 2021-9-24 10:31 编辑
|
[353 楼] 大信
[泡菜]
21-9-24 10:18
yejun 发表于 2021-9-23 22:39  因为左边是一个df,赋值的时候是右边先转换成一个二维数组再赋值,而不是你想要的左边转换成两个列再赋值。 这个情况只能一列一列赋值,我也想不出什么好的办法。那个错误也是因为两个不同类型长度的列被放在一起了。 非常感谢,解释得比较清楚了。我后来改为一次赋值一列,就没有问题。 针对这个问题,我发现更改数据的时候不用loc加条件赋值,而是采用dfx.loc[index,.....]的方式,也可以多列同时赋值。例如下面这样修改,就不会出现Nan值: for index,row in self.dfx.iterrows(): if row["rate"]< 70: self.dfx.loc[index, ["type", "score2"]] = [3, self.dfx["score1"]] 虽然赋值成功,但是仍然会出现告警: C:\Users\test\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\fromnumeric.py:3162: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. return asarray(a).ndim 我想问的是,这个告警如果不管它,会不会有什么隐患? 最后,我再改为分别赋值,就彻底没这个问题了: for index,row in self.dfx.iterrows(): if row["rate"]< 70: self.dfx.loc[index, "type"] = 3 self.dfx.loc[index,"score2"] = row["score1"]
|
[352 楼] yejun
[老坛泡菜]
21-9-23 22:39
大信 发表于 2021-9-23 15:11  再请教一个dataframe的问题。代码详见附件。 我用loc方法给df中满足条件的数据赋值,为何不满足条件的数据,变成了Nan ?
下面是运行结果: C:\Users\test\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\fromnumeric.py:3162: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. return asarray(a).ndim
--- 初始化数据后的结果 ----- Name Name1 type: 0 score1: 900 score2: -1 Name Name2 type: 0 score1: 900 score2: -1 Name Name3 type: 0 score1: 900 score2: -1 Name Name4 type: 0 score1: 900 score2: -1 Name Name5 type: 0 score1: 1000 score2: -1 Name Name6 type: 0 score1: 1000 score2: -1 Name Name7 type: 0 score1: 1000 score2: -1 --- loc赋值后的结果 ----- Name Name1 type: 3 score1: 900 score2: 900.0 Name Name2 type: 3 score1: 900 score2: 900.0 因为左边是一个df,赋值的时候是右边先转换成一个二维数组再赋值,而不是你想要的左边转换成两个列再赋值。 这个情况只能一列一列赋值,我也想不出什么好的办法。那个错误也是因为两个不同类型长度的列被放在一起了。 本帖最后由 yejun 于 2021-9-23 22:54 编辑
|
[351 楼] 大信
[泡菜]
21-9-23 15:11
yejun 发表于 2021-9-4 00:50  index在df里面其实就是一个有特殊名字的列,好像也没排序效果就是打印时候漂亮点。原来的列名就不能用了。
用 reset_index()就可以继续用id了。试试下面这样的,id应该不需要写在里面,因为reset以后会加回来。
xlist = df.loc[df[rate] 再请教一个dataframe的问题。代码详见附件。 我用loc方法给df中满足条件的数据赋值,为何不满足条件的数据,变成了Nan ? 下面是运行结果: C:\Users\test\AppData\Local\Programs\Python\Python38\lib\site-packages\numpy\core\fromnumeric.py:3162: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. return asarray(a).ndim --- 初始化数据后的结果 ----- Name Name1 type: 0 score1: 900 score2: -1 Name Name2 type: 0 score1: 900 score2: -1 Name Name3 type: 0 score1: 900 score2: -1 Name Name4 type: 0 score1: 900 score2: -1 Name Name5 type: 0 score1: 1000 score2: -1 Name Name6 type: 0 score1: 1000 score2: -1 Name Name7 type: 0 score1: 1000 score2: -1 --- loc赋值后的结果 ----- Name Name1 type: 3 score1: 900 score2: 900.0 Name Name2 type: 3 score1: 900 score2: 900.0 Name Name3 type: 3 score1: 900 score2: 900.0 Name Name4 type: 3 score1: 900 score2: 900.0 Name Name5 type: 0 score1: 1000 score2: nan Name Name6 type: 0 score1: 1000 score2: nan Name Name7 type: 0 score1: 1000 score2: nan Process finished with exit code 0 另外,这个警告信息怎么才能去除掉? fromnumeric.py:3162: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. return asarray(a).ndim
|
[350 楼] 大信
[泡菜]
21-9-4 22:28
yejun 发表于 2021-9-4 21:59  不用重新赋值啊。 reset_index()[[rate, name, id]].values.tolist() 哦,reset_index后仍然是dataframe,可以再切片,转列表
|
[349 楼] yejun
[老坛泡菜]
21-9-4 21:59
大信 发表于 2021-9-4 19:24  明白了。这个方法实际上用reset_index()去掉索引还原了id列(如果赋值给新的df的话,可以看到只包含id,rate,name三列)。但是仍然没有解决我的问题,在生成列表的时候,我需要将id列安排在rate、name的中间。而这条语句无法调整id的位置,只能在首列。
当然可以去掉索引后赋值给新的df,然后再用tolist生成列表。不过这就过于啰嗦,失去了用一条语句简练完成的目的。
还有一个方法就是在创建索引的时候给参数 drop=False,保留name列就没有上述烦恼了。但是这个感觉又造成数据“冗余”,且不那么pythonic
更正一下:“在创建索引的时候给参数 drop=False,保留id列就没有上述烦恼了” 不用重新赋值啊。 reset_index()[[rate, name, id]].values.tolist()
|
[348 楼] 大信
[泡菜]
21-9-4 21:19
想想心痛 发表于 2021-9-1 08:03  普通人学Python有什么用?
学Python很简单,但要用起来,得学一堆的周边计算机知识。需要耗费大量时间,关键学了也没啥用。 深有同感,但也不完全认同。 的确学以致用是促进学习的重要途径,漫无目的的学就像迷途的羔羊,不知道往哪个方向走。今年6月完成我开发的软件在全系统的推广应用后,也曾一度感到空虚、无所事事。后来发现在算法上有个bug需要改善、又用dataframe替代嵌套列表,这段时间又学了不少东西,感觉唯有在编码中才能体会到快乐。 其实我从去年开始学python的时候,也没有很明确的应用目标,只是用疫情数据完成数据的可视化分析从中找到了乐趣,也锻炼了编程能力。我的感觉一是“目的”要细心去发掘,身边一定有很多潜藏的需求可以让python大展宏图(比如我同事就用python帮业务部门完成了一项定期报告文档的自动生成)。二是python有很多第三方的包,可以不用去“学一堆的周边计算机知识”,只要把这些包拿来应用即可,极大地降低了你对更多更深领域软、硬件编程的探索成本。
|
[347 楼] 大信
[泡菜]
21-9-4 19:24
yejun 发表于 2021-9-4 00:50  index在df里面其实就是一个有特殊名字的列,好像也没排序效果就是打印时候漂亮点。原来的列名就不能用了。
用 reset_index()就可以继续用id了。试试下面这样的,id应该不需要写在里面,因为reset以后会加回来。
xlist = df.loc[df[rate]<80,[rate,name ]].reset_index().values.tolist() 明白了。这个方法实际上用reset_index()去掉索引还原了id列(如果赋值给新的df的话,可以看到只包含id,rate,name三列)。但是仍然没有解决我的问题,在生成列表的时候,我需要将id列安排在rate、name的中间。而这条语句无法调整id的位置,只能在首列。 当然可以去掉索引后赋值给新的df,然后再用tolist生成列表。不过这就过于啰嗦,失去了用一条语句简练完成的目的。 还有一个方法就是在创建索引的时候给参数 drop=False,保留name列就没有上述烦恼了。但是这个感觉又造成数据“冗余”,且不那么pythonic 本帖最后由 大信 于 2021-9-4 19:44 编辑 以下内容由 大信 于 2021-9-4 21:04 补充 更正一下:“在创建索引的时候给参数 drop=False,保留id列就没有上述烦恼了”
|
[346 楼] yejun
[老坛泡菜]
21-9-4 00:50
大信 发表于 2021-9-4 00:38  谢谢! 我觉得第二种写法更通俗易懂一些。
这两天翻书,百度,还是没有解决一个问题: ------------------
df表的列包括:name,id,rate,type,score 对df建立索引: df = df.set_index("id")
我想用切片方式,将表中满足条件的数据转换为列表,返给变量xlist。 希望得到的xlist列表是一个嵌套列表,形如:[[30,"A009","设备1],[72,"A002,"设备5"],,,,]
我的语句是:
xlist = df.loc[df[rate index在df里面其实就是一个有特殊名字的列,好像也没排序效果就是打印时候漂亮点。原来的列名就不能用了。 用 reset_index()就可以继续用id了。试试下面这样的,id应该不需要写在里面,因为reset以后会加回来。 xlist = df.loc[df[rate]<80,[rate,name ]].reset_index().values.tolist() 本帖最后由 yejun 于 2021-9-4 01:02 编辑 以下内容由 yejun 于 2021-9-4 03:42 补充 也可以set_index('id', drop=False)
|
[345 楼] 大信
[泡菜]
21-9-4 00:38
yejun 发表于 2021-9-2 23:06  网上找到的方法把百分比转成数字。 df['col'] = df['col'].str.rstrip('%').astype('float') / 100.0
我是在stack overflow网站找到的。
如果按照你的方法也可以写成这样。 df['rate'].apply(lambda x: int(float(x[:-1])) < 10)
不过这样效率肯定没有上面的写法好。 谢谢!  我觉得第二种写法更通俗易懂一些。 这两天翻书,百度,还是没有解决一个问题: ------------------ df表的列包括:name,id,rate,type,score 对df建立索引: df = df.set_index("id") 我想用切片方式,将表中满足条件的数据转换为列表,返给变量xlist。 希望得到的xlist列表是一个嵌套列表,形如:[[30,"A009","设备1],[72,"A002,"设备5"],,,,] 我的语句是: xlist = df.loc[df[rate<80,[rate,id,name ]].values.tolist() 当我给id列建立了索引,上面的语句中只要在列表达式中出现id就会报错。 如果没有对id列建立索引,一切运行正常,得到想要的结果。 我的问题是,如何在有index的df中进行切片时,包含有索引的列(以便将包含索引的列连同其他列转为列表)
|
[344 楼] yejun
[老坛泡菜]
21-9-2 23:06
大信 发表于 2021-9-2 22:53  再咨询一个问题,比如df有一列rate是字符串的百分数,以”%“结尾(例如:“40%”, "86%")。希望根据百分比对message列赋值,切片式的赋值语句效率最高,例如:
df.loc[int(float(df["rate"][:-1] )) 网上找到的方法把百分比转成数字。 df['col'] = df['col'].str.rstrip('%').astype('float') / 100.0 我是在stack overflow网站找到的。 本帖最后由 yejun 于 2021-9-2 23:31 编辑 以下内容由 yejun 于 2021-9-3 01:00 补充 如果按照你的方法也可以写成这样。 df['rate'].apply(lambda x: int(float(x[:-1])) < 10) 不过这样效率肯定没有上面的写法好。
|
[343 楼] xicloud
[资深泡菜]
21-9-2 23:04
|
[342 楼] 大信
[泡菜]
21-9-2 22:53
yejun 发表于 2021-8-28 11:36  第一个[]是算符,第二个只不过当成序列用()或者[]都可以。你网上看见的也可能是个复合列名,这个时候要用()。不过这个loc我不熟也是现学的,一般pandas都是用列算的,几乎不会用row。 再咨询一个问题,比如df有一列rate是字符串的百分数,以”%“结尾(例如:“40%”, "86%")。希望根据百分比对message列赋值,切片式的赋值语句效率最高,例如: df.loc[int(float(df["rate"][:-1] ))<10, (message) ] = "too low" 但是这会报错: TypeError: cannot convert the series to <class 'float'> 我怎么试都没找到在loc中对列进行运算的方法(从报错来看,这里不是column,而是series) 是不是只能用for 循环来实现呢? 还是我没有掌握技巧? for index,row in df.iterrows(): i_rate = int(float(row["rate"][:-1])) df.loc[index,"rate"] = i_rate
|
[341 楼] 想想心痛
[泡菜]
21-9-1 08:03
普通人学Python有什么用?
学Python很简单,但要用起来,得学一堆的周边计算机知识。需要耗费大量时间,关键学了也没啥用。
|
[340 楼] benniewang
[资深泡菜]
21-9-1 01:31
大信 发表于 2021-8-28 10:34  不是我懒惰,不肯搜索。 我在wall内只能用百度,关于这个问题只搜到一条比较隐晦有一定关联的问题,当时我就感觉应该用loc来赋值。由于国内信息不多,我更信任无忌的python俱乐部,这里果然高人多,热心人也多。谢谢各位的帮助! 没说你偷懒,我是说我的python也就是1/10瓶醋的水平。
|
[339 楼] yejun
[老坛泡菜]
21-8-28 11:59
大信 发表于 2021-8-28 11:27  我看网上的文章,赋值的列都是用()包围,赋值的数据都是用[ ] 包围。似乎反之也行?
self.df_pinghist.loc[index, ("alarm_type", col_lasttime) ] = [3, 6666666] 如果真的需要一行一行算我建议你写成这样, def f(row): row["alarm_type"] = 3 row[col_lasttime] = 6666666 return row self.df_pinghost = self.df_pinghost.apply(f, axis=1) 本帖最后由 yejun 于 2021-8-28 12:02 编辑
|
[338 楼] yejun
[老坛泡菜]
21-8-28 11:36
大信 发表于 2021-8-28 11:27  我看网上的文章,赋值的列都是用()包围,赋值的数据都是用[ ] 包围。似乎反之也行?
self.df_pinghist.loc[index, ("alarm_type", col_lasttime) ] = [3, 6666666] 第一个[]是算符,第二个只不过当成序列用()或者[]都可以。你网上看见的也可能是个复合列名,这个时候要用()。不过这个loc我不熟也是现学的,一般pandas都是用列算的,几乎不会用row。 本帖最后由 yejun 于 2021-8-28 11:39 编辑
|
[337 楼] 大信
[泡菜]
21-8-28 11:27
yejun 发表于 2021-8-27 17:24  因为iterows返回的是一个copy。可以写成 self.df_pinghist.loc[index, ["alarm_type", col_lasttime]] = 3, 6666666
https://pandas·pydata·org/docs/reference/api/pandas.DataFrame.iterrows.html 我看网上的文章,赋值的列都是用()包围,赋值的数据都是用[ ] 包围。似乎反之也行? self.df_pinghist.loc[index, ("alarm_type", col_lasttime) ] = [3, 6666666]
|
[336 楼] 大信
[泡菜]
21-8-28 10:40
|
[335 楼] 大信
[泡菜]
21-8-28 10:39
yejun 发表于 2021-8-27 22:07  我也是看了你的问题找文档现学的。那段文档是说千万不要这样用,因为具体会不会成功看df的数据类型。我猜可能每个列的数据类型都一样可能就可以吧?
另外df最好不要用这样的循环啊。 比如那个if就可以不用一行一行算,直接写成 index = nowtime +91 - self.df_pinghist["firsttime"] > self.FirstAlarm_time self.df_pinghist[col_lasttime][index] = 6666666 如果这样做不到的时候也可以用apply对列或者行操作。 谢谢,按条件一行语句完成修改,真是大开眼界。 前天才开始了解pandas,是为了解决我程序中一个算法的瑕疵。顺便准备用dataframe替代嵌套列表(我以前一直用嵌套列表来构建二维表),因为直接指定列名称的引用方法,比row[0] .... row[n]方便太多。 我开始对使用dataframe的想法也仅仅如此而已。因此看了几个网页就上路...... 因此学得囫囵吞枣,想当然地用list的方法来处理赋值。更不知道pandas还有这么强大的功能。 本帖最后由 大信 于 2021-8-28 10:40 编辑
|