求教一个 pandas 赋值失败的问题, pandas 赋值机制到底是怎么回事...

2020-08-21 19:03:20 +08:00
 yellowtail

df.iloc[1,0] =1 可以成功赋值,但是类似的写法,df.iloc[1].a = 1 就失败了

还有程序需要累加行实现一个 df 堆砌 之前用的 append 花了 36 秒,后来改为了 loc[i]直接写入,优化一点细节..可是还要 31 秒

求点拨...求推荐学习材料

3120 次点击
所在节点    Python
10 条回复
dongxiao
2020-08-21 21:00:10 +08:00
试试 df.loc[1,"a"]=1
imn1
2020-08-21 21:18:42 +08:00
不要在循环里面逐条 append
循环生成 dict 或其他,循环后转为 df,然后一次 append/contact
yellowtail
2020-08-23 13:36:09 +08:00
@dongxiao 想知道两种写法究竟有什么区别 为什么会失败 。。。
yellowtail
2020-08-23 13:37:47 +08:00
@imn1 感谢回复,但是不能这么写,因为增加新的行的同时需要从旧的 df 里读取和修改数据
imn1
2020-08-23 14:13:13 +08:00
1. .a 是只读的,["a"]是可写的
2. 转一下弯,df 每行或者每列只是个列表,循环读取一点不影响,关键是逐条 append 太慢
dongxiao
2020-08-23 14:33:39 +08:00
@yellowtail 区别很大,.loc 相当于按键值取,你即使对 dataframe 重排,.loc 取得的值仍是不变的,.iloc 则是按位置,顺序变了取的值也就变了。看了下描述,你的需求可以用 dataframe 的 apply 实现或者 series 的 map 实现,用的广播方式,并行计算,如果用循环那可就太慢了
volvo007
2020-08-23 18:10:26 +08:00
df 堆彻 我没太看明白
不是有一个 pd.concat 方法可以直接拼接吗?
这个方法可以接受一个数组参数,所以可以一次性拼接多个 df
但我觉得 LZ 应该知道这个函数,所以我觉得是我没理解 LZ 要实现的东西?
yellowtail
2020-08-23 21:21:54 +08:00
@imn1 意思是循环增加一行的时候,需要根据条件修改上一行的既有内容,如果每次增加一个 df 再 concat,那得在很多个 df 找到对应的修改以后再 concat 那就麻烦了 append 可能避不开了
imn1
2020-08-23 22:54:10 +08:00
@yellowtail #8
大致明白了
但我的建议是,把不需要改动的东西先算出来,先组好新的 df
然后用移动函数,再整体更改一列或者列里面的一段,这样会快很多

查查 pandas 手册,移动函数是 df 专门用于有序 index,可以批量更改多行数据的函数,例如证券的移动平均
搜 pandas.core.window 或 pandas.dataframe.rolling
yellowtail
2020-09-06 17:04:30 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/700347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX