df.iloc[1,0] =1 可以成功赋值,但是类似的写法,df.iloc[1].a = 1 就失败了
还有程序需要累加行实现一个 df 堆砌 之前用的 append 花了 36 秒,后来改为了 loc[i]直接写入,优化一点细节..可是还要 31 秒
求点拨...求推荐学习材料
1
dongxiao 2020-08-21 21:00:10 +08:00 via Android
试试 df.loc[1,"a"]=1
|
2
imn1 2020-08-21 21:18:42 +08:00
不要在循环里面逐条 append
循环生成 dict 或其他,循环后转为 df,然后一次 append/contact |
3
yellowtail OP @dongxiao 想知道两种写法究竟有什么区别 为什么会失败 。。。
|
4
yellowtail OP @imn1 感谢回复,但是不能这么写,因为增加新的行的同时需要从旧的 df 里读取和修改数据
|
5
imn1 2020-08-23 14:13:13 +08:00 1
1. .a 是只读的,["a"]是可写的
2. 转一下弯,df 每行或者每列只是个列表,循环读取一点不影响,关键是逐条 append 太慢 |
6
dongxiao 2020-08-23 14:33:39 +08:00 via Android
@yellowtail 区别很大,.loc 相当于按键值取,你即使对 dataframe 重排,.loc 取得的值仍是不变的,.iloc 则是按位置,顺序变了取的值也就变了。看了下描述,你的需求可以用 dataframe 的 apply 实现或者 series 的 map 实现,用的广播方式,并行计算,如果用循环那可就太慢了
|
7
volvo007 2020-08-23 18:10:26 +08:00 via iPhone 1
df 堆彻 我没太看明白
不是有一个 pd.concat 方法可以直接拼接吗? 这个方法可以接受一个数组参数,所以可以一次性拼接多个 df 但我觉得 LZ 应该知道这个函数,所以我觉得是我没理解 LZ 要实现的东西? |
8
yellowtail OP @imn1 意思是循环增加一行的时候,需要根据条件修改上一行的既有内容,如果每次增加一个 df 再 concat,那得在很多个 df 找到对应的修改以后再 concat 那就麻烦了 append 可能避不开了
|
9
imn1 2020-08-23 22:54:10 +08:00
@yellowtail #8
大致明白了 但我的建议是,把不需要改动的东西先算出来,先组好新的 df 然后用移动函数,再整体更改一列或者列里面的一段,这样会快很多 查查 pandas 手册,移动函数是 df 专门用于有序 index,可以批量更改多行数据的函数,例如证券的移动平均 搜 pandas.core.window 或 pandas.dataframe.rolling |
10
yellowtail OP |