V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yellowtail
V2EX  ›  Python

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

  •  
  •   yellowtail · 2020-08-21 19:03:20 +08:00 · 3261 次点击
    这是一个创建于 1556 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    查查 pandas 手册,移动函数是 df 专门用于有序 index,可以批量更改多行数据的函数,例如证券的移动平均
    搜 pandas.core.window 或 pandas.dataframe.rolling
    yellowtail
        10
    yellowtail  
    OP
       2020-09-06 17:04:30 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2699 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:05 · PVG 19:05 · LAX 03:05 · JFK 06:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.