Python爱好者俱乐部
18247 542
[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
手倦抛书 发表于 2021-9-24 20:05
最近学习pandas,兼职给财务和业务部门做码农,快50的人了,废寝忘食,乐不思蜀,哈哈


活到老,学到老

[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
纳米碳管 发表于 2021-8-28 02:48
加入這個愛好者大家庭!


欢迎!欢迎!
[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 编辑