【问题标题】:Fill blank cells with another column value in Python用Python中的另一个列值填充空白单元格
【发布时间】:2021-07-05 13:53:41
【问题描述】:

我想测试C列中的单元格是否为空白,如果是,则用A列中的值填充,如果ANaN,则用B填充。列C 可能有一些空白单元格,如下所示:

df:

    A             B               C 
0   xyz           NaN             12.03.2010    
1   abc           NaN             01.10.2009
2   NaN           14.11.2010      
3   02.10.2010    NaN

C 似乎有一些空白单元格,但是当我使用df.iloc[2, 2] == Nonepd.isnull(df.iloc[2, 2]) 进行测试时,两者都返回了False。为什么会这样?我们如何测试它是否真的是空白的?

【问题讨论】:

标签: python pandas


【解决方案1】:

replace()nan 的空字符串,然后链接一对fillna()

df.C = df.C.replace(r'^\s*$', np.nan, regex=True).fillna(df.A).fillna(df.B)

#             A           B           C
# 0         xyz         NaN  12.03.2010
# 1         abc         NaN  01.10.2009
# 2         NaN  14.11.2010  14.11.2010
# 3  02.10.2010         NaN  02.10.2010

或者以str.strip() 开头以使替换更简单:

df.C = df.C.str.strip().replace('', np.nan).fillna(df.A).fillna(df.B)

【讨论】:

  • 您好,谢谢您的回答。我将代码应用于更多数据,看起来它只替换了一些行而不是其余的。有什么想法吗?
  • @nilsinelabore 尝试将正则表达式更改为 r'^\s*$'(答案已更新)
  • 或以str.strip() 开头完全避免使用正则表达式(添加到答案中)
  • ^\s*$ 是什么意思?
  • @nilsinelabore ^ 表示字符串的开头,$ 表示字符串的结尾,\s* 表示 0 个或多个空格,因此整个正则表达式表示“完全为空或仅包含空格”
【解决方案2】:

发生这种情况是因为数据框中的缺失值可能是空字符串“”,而 NaN 是 Pandas 数据框中的不同值。所以相等性检查应该是测试一个单元格是否为空字符串,而不是使用 isnull() 或 == None。

【讨论】:

    【解决方案3】:

    另一种方式; .

    条件

    1. (df['C']=='')& (df['A'].isna()) - 如果 C 为空白且 A 为 NaN
    2. (df['C']=='')& (df['A'].notna() - 如果 C 为空白且 A 不是 NaN

    解决方案

    1. 如果满足条件1.,则解决方案为B
    2. 如果满足条件2.,则解决方案为A
    3. 如果12 均未出现,则替代解决方案是保留C

    使用实现; 使用np.select(conditions, solutions, alternative)

    现在让我们将它放入代码中。请参阅下面的代码

    conditions=[(df['C']=='')& (df['A'].isna()),(df['C']=='')& (df['A'].notna())]
    
    solution=[df['B'],df['A']]
    

    代码

     df['C']=np.select(c,sol, df['C'])
    

    结果

              A           B           C
    0         xyz         NaN  12.03.2010
    1         abc         NaN  01.10.2009
    2         NaN  14.11.2010  14.11.2010
    3  02.10.2010         NaN  02.10.2010
    

    【讨论】:

    • 您好 wwnde,感谢您的回答。您介意在您的解决方案中添加一些 cmets 以便更好地理解吗?
    • 查看我上面的编辑。如果需要,很乐意进一步解释