主题:Python爱好者俱乐部
正序浏览
主题图片汇总
主题内检索
浏览:18186 回帖:542
游客没有回帖权限
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
benniewang 发表于 2021-8-28 01:31
有人已经帮你解决了问题,恭喜。这个问题换成我,也是直接放狗搜。


不是我懒惰,不肯搜索。
我在wall内只能用百度,关于这个问题只搜到一条比较隐晦有一定关联的问题,当时我就感觉应该用loc来赋值。由于国内信息不多,我更信任无忌的python俱乐部,这里果然高人多,热心人也多。谢谢各位的帮助!
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 1.445
主题: 3
帖子: 189
注册: 2006年9月
加入這個愛好者大家庭!
发布自 iOS客户端
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.892
主题: 170
帖子: 9709
注册: 2002年1月
大信 发表于 2021-8-27 17:16
这个建议不错,准备按照这个思路修改程序。
但是今天我被另外一个问题,都快被整疯了,在此继续求助。
问题是:对dataframe单元格进行修改,然后打印查看,修改正确
但是后续多次对dataframe进行检查,居然全部都显示为 -1 ,也就是修改失效。这是怎么回事?
self.pd_pinghist 为dataframe,在函数运行的时候,其 lasttime列的数据全部初始化为 - 1
下面图片中的 2044行,print显示结果 为 66666
但是 2046、2049、2052行打印的结果都全部为 -1

请问这是怎么回事?

有人已经帮你解决了问题,恭喜。这个问题换成我,也是直接放狗搜。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
老坛泡菜
泡网分: 34.505
主题: 35
帖子: 3462
注册: 2003年7月
大信 发表于 2021-8-27 20:28
非常感谢!的确,用loc方法来赋值就解决问题了。

但是为什么我下面这个例子,用 row["A"] = ...... 的方式赋值,也成功了呢?  为啥换成我的那个程序,同样的赋值方法却失效了?


我也是看了你的问题找文档现学的。那段文档是说千万不要这样用,因为具体会不会成功看df的数据类型。我猜可能每个列的数据类型都一样可能就可以吧?

另外df最好不要用这样的循环啊。
比如那个if就可以不用一行一行算,直接写成
index = nowtime +91 - self.df_pinghist["firsttime"] > self.FirstAlarm_time
self.df_pinghist[col_lasttime][index] = 6666666
如果这样做不到的时候也可以用apply对列或者行操作。 本帖最后由 yejun 于 2021-8-27 22:26 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 29.179
主题: 320
帖子: 14187
注册: 2008年6月
大信 发表于 2021-8-27 08:50
尤其是还要将这个dataframe传递给函数使用,那么主程序和函数里都要申明:
name = 'Name'
age = 'Age'

这也太麻烦了一点吧?


如果你的软件突然有一天想改成支持中文,那么只需要改成

name = "姓名"
age = “年龄”

这两行即可,而不是替换上千个不同的地方。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
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


非常感谢!的确,用loc方法来赋值就解决问题了。

但是为什么我下面这个例子,用 row["A"] = ...... 的方式赋值,也成功了呢?  为啥换成我的那个程序,同样的赋值方法却失效了?
登录后可直接显示原图
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
老坛泡菜
泡网分: 34.505
主题: 35
帖子: 3462
注册: 2003年7月
大信 发表于 2021-8-27 17:16
这个建议不错,准备按照这个思路修改程序。
但是今天我被另外一个问题,都快被整疯了,在此继续求助。
问题是:对dataframe单元格进行修改,然后打印查看,修改正确
但是后续多次对dataframe进行检查,居然全部都显示为 -1 ,也就是修改失效。这是怎么回事?
self.pd_pinghist 为dataframe,在函数运行的时候,其 lasttime列的数据全部初始化为 - 1
下面图片中的 2044行,print显示结果 为 66666
但是 2046、2049、2052行打印的结果都全部为 -1

请问这是怎么回事?


因为iterows返回的是一个copy。可以写成
    self.df_pinghist.loc[index, ["alarm_type", col_lasttime]] = 3, 6666666

You should never modify something you are iterating over. This is not guaranteed to work in all cases. Depending on the data types, the iterator returns a copy and not a view, and writing to it will have no effect.


https://pandas_pydata_org/docs/reference/api/pandas.DataFrame.iterrows.html 本帖最后由 yejun 于 2021-8-27 17:57 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
benniewang 发表于 2021-8-27 09:28
如果反复使用'Age',当然是赋值给age更好,需要重新赋值就全部更新了。而你这样写代码,每一处‘Age’都要修改,而且还容易出错。代码太‘硬’了。


这个建议不错,准备按照这个思路修改程序。
但是今天我被另外一个问题,都快被整疯了,在此继续求助。
问题是:对dataframe单元格进行修改,然后打印查看,修改正确
但是后续多次对dataframe进行检查,居然全部都显示为 -1 ,也就是修改失效。这是怎么回事?
self.pd_pinghist 为dataframe,在函数运行的时候,其 lasttime列的数据全部初始化为 - 1
下面图片中的 2044行,print显示结果 为 66666
但是 2046、2049、2052行打印的结果都全部为 -1

请问这是怎么回事?

本帖最后由 大信 于 2021-8-27 17:16 编辑
登录后可直接显示原图
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.892
主题: 170
帖子: 9709
注册: 2002年1月
大信 发表于 2021-8-27 08:50
尤其是还要将这个dataframe传递给函数使用,那么主程序和函数里都要申明:
name = 'Name'
age = 'Age'

这也太麻烦了一点吧?

如果反复使用'Age',当然是赋值给age更好,需要重新赋值就全部更新了。而你这样写代码,每一处‘Age’都要修改,而且还容易出错。代码太‘硬’了。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
老坛泡菜
泡网分: 34.505
主题: 35
帖子: 3462
注册: 2003年7月
大信 发表于 2021-8-27 08:50
尤其是还要将这个dataframe传递给函数使用,那么主程序和函数里都要申明:
name = 'Name'
age = 'Age'

这也太麻烦了一点吧?


理论上你还可以重新定义 frame的__setitem__,让他不要加新的column。不过这样不符合python dict的一般用法了,而且datafram的[]还有很多其他功能,不光是设置列。

自动加列的code在这里,把这三行删除加没有的列就会出错了。
https://github_com/pandas-dev/pandas/blob/15302106ef41e562d2f80c6d1ecffdd4aea7158a/pandas/core/frame.py#L3770 本帖最后由 yejun 于 2021-8-27 09:31 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 27.864
主题: 82
帖子: 6513
注册: 2008年7月
大信 发表于 2021-8-27 08:50
尤其是还要将这个dataframe传递给函数使用,那么主程序和函数里都要申明:
name = 'Name'
age = 'Age'

这也太麻烦了一点吧?

这个是编程的正规格式。
通常,字符串'Name','Age'这种都会放在配置文件中
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
benniewang 发表于 2021-8-27 08:01

我一般会这么写:

name = 'Name'
age = 'Age'

columns = [name, age]

df = pd.DataFrame(data, columns = columns)

很少会写:
columns = ['Name', 'Age']


尤其是还要将这个dataframe传递给函数使用,那么主程序和函数里都要申明:
name = 'Name'
age = 'Age'

这也太麻烦了一点吧?

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.892
主题: 170
帖子: 9709
注册: 2002年1月
大信 发表于 2021-8-27 08:44
我用 row[A] = 30
依然报错:

name ‘A’ is not defined

难道我们用的不是同一个pandas ?

代码贴全。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
benniewang 发表于 2021-8-27 08:01
另外你的马甲暴露了。。。

我一般会这么写:

name = 'Name'
age = 'Age'

columns = [name, age]

df = pd.DataFrame(data, columns = columns)

很少会写:
columns = ['Name', 'Age']


看明白了,但是这样操作,不多一个步骤么 ?
先要把 ‘name’ 赋给 name变量

name = 'Name'
age = 'Age'

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
........ 本帖最后由 大信 于 2021-8-27 08:47 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 29.179
主题: 320
帖子: 14187
注册: 2008年6月
连雨不知春去 发表于 2021-8-27 07:23
那是我的写法有问题?字段名称不应该用引号?

呵呵,主要是跟网上学的时候似乎例子中都有引号。原来这样啊


字段名是个字符串,不管里面是什么东西,只要两边有引号就是个合法字符串,不管是“A”还是“AA”都不会报错(excel表里其实存在AA列,Z用完就是AA了)

后面这个方法是先把字符串"A"赋值给了一个变量A,以后使用变量A的时候就等于使用了字符串"A"

但是由于没有定义变量AA,所以使用AA的时候会报错。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.892
主题: 170
帖子: 9709
注册: 2002年1月
连雨不知春去 发表于 2021-8-27 07:23
那是我的写法有问题?字段名称不应该用引号?

呵呵,主要是跟网上学的时候似乎例子中都有引号。原来这样啊


另外你的马甲暴露了。。。

我一般会这么写:

name = 'Name'
age = 'Age'

columns = [name, age]

df = pd.DataFrame(data, columns = columns)

很少会写:
columns = ['Name', 'Age']
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.892
主题: 170
帖子: 9709
注册: 2002年1月
连雨不知春去 发表于 2021-8-27 07:23
那是我的写法有问题?字段名称不应该用引号?

呵呵,主要是跟网上学的时候似乎例子中都有引号。原来这样啊


在python里,单引号和双引号都是用来告诉你引号中间的是字符串。

先把字符赋值给一个变量,然后都使用这个变量而不是字符,变量名写错了就会报错的。当然或许还有更好的方法。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
禁言中
泡网分: 5.065
主题: 103
帖子: 1487
注册: 2020年10月
benniewang 发表于 2021-08-26 22:08
A = 'A'

row = 30--没问题

row = 30--报错


那是我的写法有问题?字段名称不应该用引号?

呵呵,主要是跟网上学的时候似乎例子中都有引号。原来这样啊
发布自 iOS客户端
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.892
主题: 170
帖子: 9709
注册: 2002年1月
大信 发表于 2021-8-26 19:25
发现pandas一个很容易出错的地方。
本来用列名称来访问数据,非常方便。
但是如果赋值的时候,列名称写错了,python运行起来是不会报错的。
你还以为赋值成功了呢!

有解决办法么?@benniewang @黄黑黄


A = 'A'

row[A] = 30--没问题

row[AA] = 30--报错

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
发现pandas一个很容易出错的地方。
本来用列名称来访问数据,非常方便。
但是如果赋值的时候,列名称写错了,python运行起来是不会报错的。
你还以为赋值成功了呢!

有解决办法么?@benniewang @黄黑黄

登录后可直接显示原图
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.265
主题: 214
帖子: 11110
注册: 2004年3月
闲聊状态 发表于 2021-3-29 14:58
就sklearn来说
anaconda的可以调用更多的核而且依赖MKL pip的或者debian ubuntu自带的不行


yejun 发表于 2021-3-29 14:15
numpy可以用到anaconda自带的mkl库,矩阵运算比开源的版本可以快几倍吧。


不懂,都太高深了

我的应用需要特定版本的python,需要特定版本的老多软件,所以用miniconda管理环境几乎是我的唯一选择~

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 18.239
主题: 11
帖子: 15129
注册: 2012年6月
Patriot 发表于 2021-3-29 12:05
还是有点儿杀鸡用牛

就sklearn来说
anaconda的可以调用更多的核而且依赖MKL pip的或者debian ubuntu自带的不行



(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
老坛泡菜
泡网分: 34.505
主题: 35
帖子: 3462
注册: 2003年7月
Patriot 发表于 2021-3-29 12:05
还是有点儿杀鸡用牛


numpy可以用到anaconda自带的mkl库,矩阵运算比开源的版本可以快几倍吧。
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.265
主题: 214
帖子: 11110
注册: 2004年3月
闲聊状态 发表于 2021-3-29 10:51
只是需要Numpy,pandas 可以用miniconda


还是有点儿杀鸡用牛
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 18.239
主题: 11
帖子: 15129
注册: 2012年6月
Patriot 发表于 2021-3-29 10:50
如果只是需要Numpy,pandas,的确没必要anaconda,anaconda安装本身就好几个GB~~


只是需要Numpy,pandas 可以用miniconda
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
资深泡菜
泡网分: 46.265
主题: 214
帖子: 11110
注册: 2004年3月
大信 发表于 2021-3-28 12:24
哦,我还没有遇到这么复杂的情况。numpy、pandas 的pip安装都很简单。没有用到更深入的数据分析包


如果只是需要Numpy,pandas,的确没必要anaconda,anaconda安装本身就好几个GB~~

(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 18.239
主题: 11
帖子: 15129
注册: 2012年6月
闲聊状态 发表于 2021-3-25 15:40
erp能导出来的估计也不会很大,而access导入execl本身就比较简单

稍微复杂点的逻辑 access的sql也能干了

要是上python,感觉需要结合数据库 最简单的就是sqlite 剩下的都得安装

而且都是office一家的 相互通用也要好些,而且更新表并不影响查询视图,对于固定性工作其实很友好了


觉得access自带的查询视图不好用的  还可以用通用的SQL工具进行查询

dbeaver 这玩意支持的数据库很多而且win linux都好用,还是JDBC的,那些个国产数据库要是提供jdbc程序也可以用 本帖最后由 闲聊状态 于 2021-3-29 10:44 编辑
登录后可直接显示原图
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
泡菜
泡网分: 7.186
主题: 58
帖子: 1366
注册: 2006年12月
yejun 发表于 2021-3-28 05:36
我觉得anaconda最大的好处是可以在windows上装数据分析的包。很多包都需要编译,而且编译器版本必须和python自己的完全匹配,否则就编译不了,支持库也要一个一个手动安装。anaconda直接提供了这些包的binary版本。在linux上优势确实不大,可能对gpu的支持好点。


哦,我还没有遇到这么复杂的情况。numpy、pandas 的pip安装都很简单。没有用到更深入的数据分析包
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
老坛泡菜
泡网分: 34.505
主题: 35
帖子: 3462
注册: 2003年7月
我觉得anaconda最大的好处是可以在windows上装数据分析的包。很多包都需要编译,而且编译器版本必须和python自己的完全匹配,否则就编译不了,支持库也要一个一个手动安装。anaconda直接提供了这些包的binary版本。在linux上优势确实不大,可能对gpu的支持好点。 本帖最后由 yejun 于 2021-3-28 05:45 编辑
(0)
(0)
只看该作者
不看该作者
加入黑名单
举报
返回顶部
个人图文集
个人作品集
回复主题: Python爱好者俱乐部
功能受限
游客无回复权限,请登录后再试