【问题标题】:How to conditionally fill a cell based on the value of another cell如何根据另一个单元格的值有条件地填充一个单元格
【发布时间】:2019-05-21 18:08:13
【问题描述】:

对于 ProductName 的值为 Salad 的行,我想用单词“valid”填充“SaleTypeName”列的 NaN 单元格值。

到目前为止,我已经走到了这一步: sales['SaleTypeName'].fillna("Valid", inplace=True) 但是我在这里缺少一个条件方面,因此当出现 NaN 时不会填充整个列

我有以下数据:

import pandas as pd
df = pd.DataFrame ({'Flight Day': ['2018-10-01', '2018-10-01','2018-10-01', '2018-10-01', '2018-10-02','2018-10-02', '2018-10-02', '2018-10-02', '2018-10-03','2018-10-03’, '2018-10-03','2018-10-03’],'Flight Number': [LX1336, LX1337, LX1472, LX1473, LX1336, LX1337, LX1472, LX1473, LX1336, LX1337, LX1472, LX1473],'STD Departure': [10, 15, 8, 11,10, 15, 8, 14,10, 15, 8, 11], ‘Quantity': [2, NaN, 8, 4,3, 2, 3, 1,NaN, 5, 2, 1],’ProductName': [Bircher, Salad, Carac, Salad, Bircher, Carac, Carac, Salad,Bircher, Carac, Carac, Salad], 'SaleTypeName': [NaN, NaN, NaN, NaN ,NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN]})

【问题讨论】:

  • 请正确粘贴您的代码。您提供的代码有很多错误。我无法初始化 df。
  • 试试df.loc[df['A'] == 'foo']['SaleTypeName'].fillna("Valid", inplace=True)
  • 很高兴您提供了创建 df 的代码,但它引用了许多代码中不存在的名称。为了让我们甚至创建 df,我们必须先将所有内容都转换为字符串,然后才能尝试解决问题

标签: python python-3.x dataframe conditional


【解决方案1】:

你可以使用

df.SaleTypeName.mask(df.ProductName=='Salad', 'Valid', inplace=True)

mask()函数用于在SaleTypeName列中选择ProductName"Salad"的行,其值被"Valid"替换。

inplace 参数用于对原始数据框本身进行更改。

docs

【讨论】:

    【解决方案2】:

    对于这个特殊的问题,你可以试试这段代码,然后你可以做相应的修改。

    数据帧:

    import pandas as pd
    import numpy as np
    df = pd.DataFrame (
        {'Flight Day': ['2018-10-01', '2018-10-01','2018-10-01', '2018-10-01', '2018-10-02','2018-10-02', '2018-10-02', '2018-10-02', '2018-10-03','2018-10-03', '2018-10-03','2018-10-03'],
         'Flight Number': ['LX1336', 'LX1337', 'LX1472', 'LX1473', 'LX1336', 'LX1337', 'LX1472', 'LX1473', 'LX1336', 'LX1337', 'LX1472', 'LX1473'],
         'STD Departure': [10, 15, 8, 11,10, 15, 8, 14,10, 15, 8, 11],
         'Quantity': [2, np.NaN, 8, 4,3, 2, 3, 1,np.NaN, 5, 2, 1],
         'ProductName': ['Bircher',' Salad',' Carac',' Salad',' Bircher',' Carac',' Carac',' Salad','Bircher',' Carac',' Carac',' Salad'],
         'SaleTypeName': [np.NaN, np.NaN, np.NaN, np.NaN ,np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN]})
    

    要实现的代码部分:

    def replace(name):
        return "valid" if name.strip()=="Salad" else np.NaN
    
    df['SaleTypeName'] = df.loc[:,'ProductName'].apply(lambda x: replace(x))
    

    输出:

        ProductName SaleTypeName
    0      Bircher          NaN
    1        Salad        valid
    2        Carac          NaN
    3        Salad        valid
    4      Bircher          NaN
    5        Carac          NaN
    6        Carac          NaN
    7        Salad        valid
    8      Bircher          NaN
    9        Carac          NaN
    10       Carac          NaN
    11       Salad        valid
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 2016-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多