如果同一行中的2列中具有NAN值,则将其放在熊猫中

时间:2019-12-09 08:55:41

标签: python pandas

我是熊猫的新手,正在尝试完成以下任务:

我有一个看起来像这样的数据框:

row    A     B     
1      abc   abc 
2      abc   
3            abc 
4
5      abc   abc 

我想要的输出看起来像这样:

row    A     B     
1      abc   abc 
2      abc   
3            abc 
5      abc   abc 

如果A列和B列均无值,我将尝试删除行:

if finalized_export_cf[finalized_export_cf['A']].str.len()<2:
    if finalized_export_cf[finalized_export_cf['B']].str.len()<2:
        finalized_export_cf[finalized_export_cf['B']].drop()

但这给了我以下错误:

ValueError: cannot index with vector containing NA / NaN values

当两列都为空单元格时如何删除值? 谢谢您的建议。

5 个答案:

答案 0 :(得分:2)

您可以通过在链中使用.isnull()all()来检查所有行是否都为空。 isnull()产生一个带有布尔值的数据框,而all(axis=1)检查给定行中的所有值是否为true。如果是这种情况,则意味着行中的所有值都为空:

inds = df[["A", "B"]].isnull().all(axis=1) 

然后,您可以使用inds来清理所有只有空值的行。首先使用tilda ~取反它,否则您只能丢失值:

df = df.loc[~inds, :]

答案 1 :(得分:2)

如果缺少的值是NaN,则将DataFrame.dropnaall和子集参数一起使用:

print (df)
   row    A    B
0    1  abc  abc
1    2  abc  NaN
2    3  NaN  abc
3    4  NaN  NaN
4    5  abc  abc

df = df.dropna(how='all', subset=['A','B'])
print (df)
   row    A    B
0    1  abc  abc
1    2  abc  NaN
2    3  NaN  abc
4    5  abc  abc

或者如果空值是空字符串,请使用DataFrame.any,比较不等于''

print (df)
   row    A    B
0    1  abc  abc
1    2  abc     
2    3       abc
3    4          
4    5  abc  abc


df = df[df[['A','B']].ne('').any(axis=1)]
print (df)
   row    A    B
0    1  abc  abc
1    2  abc     
2    3       abc
4    5  abc  abc

答案 2 :(得分:2)

对于您的用例,您可以创建一个掩码并获取A和B不是True的值:

mask = df.isna()
df[~((mask.A == True) & (mask.B == True))] 

输出:

   row    A    B
0    1  abc  abc
1    2  abc  NaN
2    3  NaN  abc
4    5  abc  abc

答案 3 :(得分:1)

如果只有两列-您可以通过将pandas.dataFrame.dropnahow属性设置为'all':

df.dropna(how='all')

答案 4 :(得分:1)

首先,我们需要将空格更改为NaN

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

然后在设置子行的同时放下na

df.dropna(subset=['A','B'],how='all').fillna(' ') # if you want spaces for na
print(df)
    row    A    B
0    1  abc  abc
1    2  abc     
2    3  abc     
4    5  abc  abc
相关问题