簡體   English   中英

pandas dataframe:無法應用 lambda 函數根據條件創建新列 if NaN or NA or \n or \t etc then 'No' else 'Yes'

[英]pandas dataframe: failed to apply lambda function to create new column based on condition if NaN or NA or \n or \t etc then 'No' else 'Yes'

我有一個熊貓數據框:

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

我想做的是:

  1. 根據以下條件創建列myCol1 ,即如果myCol包含“NA”或“NaN”值或“為空”(可能是因為\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

這將起作用:

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是來自 DataFrame 中單個單元格的字符串,因此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'值,這都將起作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM