首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有pandas/python方法可以基于3列标准更改行的值?

是否有pandas/python方法可以基于3列标准更改行的值?
EN

Stack Overflow用户
提问于 2020-08-13 06:12:07
回答 2查看 41关注 0票数 0

我正在使用一个类似于下表的表:

代码语言:javascript
复制
   ID    NAME    DIRECTION    FOUND    LOST
    A     Rock      up           7        12
    A     Sap      down         15        17  
    A     Leaf      up          18        19
    B     Sap       up           5         9  
    B     Leaf      up          11        20
    B     Rock     down         22        23  
    C     Rock      up          12        14
    C     Sap      down         17        21  

对于每个ID,我需要检查名称是Sap的位置,然后需要检查方向。如果Sap Direction = down,那么我需要反转该ID的方向值。理想的输出如下:

代码语言:javascript
复制
   ID    NAME    DIRECTION    FOUND    LOST
    A     Rock    down           7        12
    A     Sap      up           15        17  
    A     Leaf    down          18        19
    B     Sap      up            5         9  
    B     Leaf     up           11        20
    B     Rock    down          22        23  
    C     Rock    down          12        14
    C     Sap      up           17        21  

我从group_by()方法开始,然后我想遍历这些组。我只能打印键和值对,但不能遍历它们。

代码语言:javascript
复制
for name,group in groups:
     print(name, group)

('A',   ID  NAME DIRECTION  FOUND  LOST
0  A  Rock         +      7    12
1  A   Sap         -     15    17
2  A  Leaf         +     18    19)
('B',   ID  NAME DIRECTION  FOUND  LOST
3  B   Sap         +      5     9
4  B  Leaf         +     11    20
5  B  Rock         -     22    23)
('C',   ID  NAME DIRECTION  FOUND  LOST
6  C  Rock         +     12    14
7  C   Sap         -     17    21)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-08-13 07:22:05

这是我做这项工作的方式:

代码语言:javascript
复制
s=set()
for i in range(len(df)):
    if df.NAME[i]=='Sap' and df.DIRECTION[i]=='down':
        s.add(df.ID[i])
for k in range(len(df)):
    if df.ID[k] in s:
        if df.DIRECTION[k]=='down':
            df.DIRECTION[k]='up'
        else:
            df.DIRECTION[k]='down'
票数 0
EN

Stack Overflow用户

发布于 2020-08-13 06:19:39

您可以在不分组的情况下实现这一点:

代码语言:javascript
复制
arr = df.loc[df['NAME'].str.contains('Sap') & df['DIRECTION'].eq('down'),'ID'].unique()
mask = df['ID'].isin(arr)
df.loc[mask, 'DIRECTION'] = df.loc[mask, 'DIRECTION'].replace(['up','down'],['down','up'])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63385380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档