当前位置: 首页 > 知识库问答 >
问题:

熊猫:根据其他列值有条件地替换值

郭翰翮
2023-03-14

我有一个数据帧(df),看起来像这样:

                    environment     event   
time                    
2017-04-28 13:08:22     NaN         add_rd  
2017-04-28 08:58:40     NaN         add_rd  
2017-05-03 07:59:35     test        add_env
2017-05-03 08:05:14     prod        add_env
...

现在,我的目标是,对于事件列中的每个add_rd,应将环境列中关联的NaN-值替换为字符串rd

                    environment     event   
time                    
2017-04-28 13:08:22     RD          add_rd  
2017-04-28 08:58:40     RD          add_rd  
2017-05-03 07:59:35     test        add_env
2017-05-03 08:05:14     prod        add_env
...

到目前为止我做了什么

我偶然发现了df['环境']=df['环境]. fillna('RD'),它替换了每个NaN(这不是我要找的),pd.isnull(df['环境'])缺少值和np.where(df['环境'],x,y),这似乎是我想要的,但不起作用。此外,我尝试了这个:

import pandas as pd

for env in df['environment']:
    if pd.isnull(env) and df['event'] == 'add_rd':
        env = 'RD'

缺少索引或某种迭代器来访问事件列中的等效值
我试过这个:

df['environment'] = np.where(pd.isnull(df['environment']), df['environment'] = 'RD', df['environment'])

SyntaxError: keyword can't be an expression

这显然不起作用。

我看了几个问题,但不能基于答案中的建议。布莱克的问题西蒙的问题szli的问题扬·威廉斯·图尔普的问题

那么,如何基于其他列的值替换列中的值呢?

共有3个答案

南门棋
2023-03-14

使用DataFrame.loc替换特定列中的值

In [1]: import pandas as pd

In [2]: dictionary = {'time': ['2017-04-28 13:08:22', '2017-04-28 08:58:40', 
                               '2017-05-03 07:59:35','2017-05-03 08:05:14'],
                       'environment': ['NaN', 'NaN', 'test', 'prod'], 
                       'event': ['add_rd', 'add_rd', 'add_env', 'add_env']
                     }

In [3]: df = pd.DataFrame(dictionary, columns= ['time', 'environment', 'event'])
        print(df) 
        
Out [3]:                  time environment    event
         0  2017-04-28 13:08:22         NaN   add_rd
         1  2017-04-28 08:58:40         NaN   add_rd
         2  2017-05-03 07:59:35        test  add_env
         3  2017-05-03 08:05:14        prod  add_env

In [4]: df.loc[df['event'] == 'add_rd', 'environment'] = 'RD'
        print(df) 
        
Out [4]:                  time environment    event
         0  2017-04-28 13:08:22          RD   add_rd
         1  2017-04-28 08:58:40          RD   add_rd
         2  2017-05-03 07:59:35        test  add_env
         3  2017-05-03 08:05:14        prod  add_env
艾谦
2023-03-14

您可以考虑使用其中

df.environment.where((~df.environment.isnull()) & (df.event != 'add_rd'),
                     'RD', inplace=True)

如果不满足条件,则用第二个元素替换这些值。

云卓
2023-03-14

现在我的目标是,对于事件列中的每个add_rd,环境列中关联的NaN值应该替换为字符串rd。

根据@Zero的评论,使用pd。数据帧。loc和布尔索引:

df.loc[df['event'].eq('add_rd') & df['environment'].isnull(), 'environment'] = 'RD'
 类似资料:
  • 我有一个带有几列的。其中一列包含使用货币的符号,例如欧元或美元符号。另一列包含预算值。例如,在一行中,它可能意味着5000欧元的预算,而在下一行中,它可能意味着2000美元的预算。 在熊猫我想添加一个额外的列到我的DataFrame,正常化的欧元预算。所以基本上,对于每一行,如果货币列中的符号是欧元符号,新列中的值应该是预算列中的值*1,新列中的值应该是预算列的值*0.78125如果货币栏中的符号

  • 问题内容: 我知道这个问题有很多主题,但是没有一种方法适合我,因此我将发布有关我的具体情况的信息 我有一个看起来像这样的数据框: 我想做的是将“性别”列中的全0替换为“女”,并将所有1替换为“男”,但是当我使用上面的代码时,数据框中的值似乎没有变化 我是否使用了replace()错误?还是有更好的方法进行条件值替换? 问题答案: 是的,您使用的是错误的,默认情况下不是就地操作,它会返回替换的数据框

  • 我必须解决这个问题:目标:删除大多数行缺少输入的列:1。数据帧df:数据帧2。阈值:确定将删除哪些列。如果阈值为.9,则缺少90%值的列将被丢弃:1。带删除列的数据帧df(如果未删除任何列,则返回相同的数据帧) Excel文档截图 我编码了这个: 我必须有“自我、博士和阈值”,不能添加更多。代码必须通过下面的测试用例: 当我运行VT.drop_nan_col(df,0.9). head()时,我不

  • 我有一个数据框架: 和一本参考词典: 我的目标是将所有出现的< code > replacement _ dict[' X1 ']替换为' X1 ',然后将这些行合并在一起。例如,“x1”、“x2”、“x3”或“x4”的任何实例都将被替换为“X1”等。 我可以通过选择包含任何这些字符串的行并将其替换为“X1”来实现这一点: 给予: 现在,如果我选择所有包含“X1”的行并将它们合并,我将得到: 因此

  • 假设我有一个表customer(int id,类型varchar,首选项jsonb)。类型可以是、等。根据列类型值,首选项JSON结构将有所不同。 在从数据库加载客户记录时,如果type=regular我希望将其转换为对象类型,如果type=premium我希望将其转换为对象类型。 我已经阅读了几篇关于使用JOOQ JSON转换器/绑定的教程。但是它们是一对一映射,不是基于条件的(取决于另一个列值

  • 问题内容: 注意:为简单起见,我使用一个玩具示例,因为复制/粘贴数据帧在堆栈溢出中很困难(请让我知道是否有简便的方法来执行此操作)。 有没有一种方法可以将一个数据帧中的值合并到另一个数据帧中而无需获取_X,_Y列?我希望一列中的值替换另一列中的所有零值。 在上一篇文章中,我尝试了Combine_First和dropna(),但是这些都做不到。 我想用df2中的值替换df1中的零。此外,我希望根据d