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
zvDC
V2EX  ›  Python

求助: Pandas 添加列,并根据其他列的值判断之后返回结果

  •  
  •   zvDC · 2017-01-13 13:46:03 +08:00 · 7704 次点击
    这是一个创建于 2862 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教 pandas 问题

    测试数据如下:

    df
        name    type    number
    0   David   A       1234
    1   Tom    B       2233
    2   Jack    C       2244
    3   Allen    B       2355      
    

    想在 df 后面插入一列,叫 df=['is_valid']

    此栏中的值主要用于判断对应行中各列数据的有效性:比如长度,是否为空值,或值是否为限定允许的值 只要有一列的判断结果为 False ,is_valid 就为 Fals

    有效条件依次为:

    • name 列值: name 值非空 , is_valid = True ;否则为 False ;
    • type 列值: type 值在 ['A', 'B', 'C', 'D'] 中, is_valid = True ,否则为 False
    • number number 值长度为 4 , is_valid = True ,否则为 False

    想法是,一列一列地判断,根据判断结果对 is_valid 栏的值进行修订 ( True or False )

    先用空值填充

    df['is_valid'] = ''

    判断 name 列值是否为空

    df['is_valid'] = df.name.notnull()

    此时查看 df['is_valid'] 值,大致为:

    df['is_valid']
    
    0       True
    1       True
    2      False  (name 中值为空)
    3       True
    
    

    问题如下:

    1 、如何让判断第二列的时候,当判断的结果为 False 时才会更新 is_valid 的值

    2 、如何判断 第二列 type 值在限定范围内,问号处怎么处理? df['is_valid'] = df.type.?

    谢谢!

    8 条回复    2017-01-14 12:25:00 +08:00
    zvDC
        1
    zvDC  
    OP
       2017-01-13 13:46:52 +08:00
    困扰半天了,向各位大侠求助,先谢谢啦。
    zvDC
        2
    zvDC  
    OP
       2017-01-13 13:52:51 +08:00
    哦,测试数据中 name 列第三个值,应该为空的,不好意思。
    bigtan
        3
    bigtan  
       2017-01-13 14:03:04 +08:00
    ![QQ 截图 20170113140200.png]( https://ooo.0o0.ooo/2017/01/13/58786d8676c8d.png)
    bigtan
        4
    bigtan  
       2017-01-13 14:04:50 +08:00
    你那个 name 的判断我没太看明白,大概是这个套路,你琢磨一下
    bigtan
        5
    bigtan  
       2017-01-13 14:05:54 +08:00
    ![QQ 截图 20170113140529.png]( https://ooo.0o0.ooo/2017/01/13/58786e3837401.png)
    bigtan
        6
    bigtan  
       2017-01-13 14:06:44 +08:00
    看下面这个吧,大概是这么个套路,上面少些了一个判断,不明白你可以加我 qq ,我教你
    ruoyu0088
        7
    ruoyu0088  
       2017-01-13 19:38:24 +08:00
    zvDC
        8
    zvDC  
    OP
       2017-01-14 12:25:00 +08:00
    @bigtan @ruoyu0088 谢谢两位热心帮助

    最后用了 逻辑与判断来处理了

    ```
    df['is_valid'] = df.name.notnull() & df.type.isin(['A', 'B', 'C', 'D']) & (df.number.str.len() == 4)
    ```

    注意最后一个 条件,一定要括在括号里,运算符的优先级问题。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1376 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 17:43 · PVG 01:43 · LAX 09:43 · JFK 12:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.