pandas dataframe:未能应用lambda函数根据条件创建新列,如果为NaN或NA或\n或\t等,则为“否”或“是”

2024-09-30 20:17:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据框:

data = pd.DataFrame({'myCol': ['NaN','NA','xsysdf dfsf','ertrret ertret','\n','sdfdsfsdfsf','erw3242werw']
})

我想做的是:

  1. 根据以下条件创建列myCol1,即如果myCol包含'NA'或'NaN'值或'is Empty'(可能是因为\n或类似\t的原因),在myCol1中,值将显示为No,否则Yes

  2. 因此,我的新数据帧应该如下所示:

新数据帧:

 myCol          myCol1
 NaN            No
 NA             No
 xsysdf dfsf    Yes
 ertrret ertret Yes
 \n             No
 sdfdsfsdfsf    Yes
 erw3242werw    Yes

我想做的事情如下:

data['myCol1'] = data['myCol'].apply(lambda x: 'No' if(str(x) == 'nan') else 'Yes')

data['myCol1'] = data['myCol'].apply(lambda x: 'No' if np.isnan else 'Yes')

data['myCol1'] = data['myCol'].apply(lambda x: 'No' if(np.all(pd.notnull(x))) else 'Yes')

但是上面的每一个代码都会将结果作为所有行发送给我='No'

 data.groupby('myCol2').size()
 myCol2
 No    223567
 dtype: int64

Tags: 数据lambdanodataifnanelseyes
3条回答

这将有助于:

import numpy as np
exclusions = ['nan', 'na', '\n', '\t']
data['myCol1'] = data['myCol'].apply(lambda x: any([x.lower() == exclusion for exclusion in exclusions]))
data['myCol1'] = np.where(data['myCol1'], 'No', 'Yes')

这几乎没有问题,除了预期的字符串是'NaN'而不是'nan'

# data['myCol1'] = data['myCol'].apply(lambda x: 'No' if(str(x) == 'nan') else 'Yes')
data['myCol1'] = data['myCol'].apply(lambda x: 'No' if(str(x).lower() == 'nan') else 'Yes')

这个函数检查函数np.isnan的真实性,而不是调用函数,因此它总是返回True大小写。此外,np.isnan不能与非数字类型一起使用:

# data['myCol1'] = data['myCol'].apply(lambda x: 'No' if np.isnan else 'Yes')

这里x是数据帧中单个单元格中的字符串,因此np.all将迭代字符串中的字符,并检查每个字符的条件。由于所有字符串都没有空字符,因此始终返回True大小写:

# data['myCol1'] = data['myCol'].apply(lambda x: 'No' if(np.all(pd.notnull(x))) else 'Yes')

试试这个:

def process_data(data):
    if str(data).lower() == 'nan' or str(data).lower() == 'na' or str(data).strip() == '':
        return 'No'
    return 'Yes'

data['myCol1'] = data['myCol'].apply(process_data)

print (data)

输出:


            myCol myCol1
0             NaN     No
1              NA     No
2     xsysdf dfsf    Yes
3  ertrret ertret    Yes
4              \n     No
5     sdfdsfsdfsf    Yes
6     erw3242werw    Yes

无论您是否将NA值或'NA'值编码为字符串,这都将起作用

相关问题 更多 >