[英]Set a pandas column Boolean value based on other columns in the row
假設一個DataFrame
C1 C2 C3
1 NaN NaN NaN
2 20.1 15 200
3 NaN 12 100
4 22.5 8 80
我想基於行其余部分的布爾值創建一個新列。 例如,是否有NaN值? 在這種情況下,該行的新列值將為“ False”。
或者,也許所有的值都是NaN嗎? 在這種情況下,我可能希望新列顯示False,否則為True(我們確實有一些值)
我考慮過使用df.notnan()
創建一個布爾型DataFrame,
C1 C2 C3
1 False False False
2 True True True
3 False True True
4 True True True
我確定我只是缺少一些簡單的東西,但是我無法提出一種基於對每行中現有項目進行“或”運算來創建第四列的方法。
同樣,一種通用的解決方案將是很好的,不需要建立布爾值的臨時DF。
背景:我有一個數據集。 營養值僅偶爾采樣,因此許多行不包含那些值。 我希望有一個“營養素采樣”列,根據我是否希望在此記錄中看到任何營養素樣品數據,其值為True或False。 有6種可能的營養素,我不想檢查所有6列。
我可以編寫檢查所有6列的代碼; 我似乎無法用真值創建新列。
你可以做,使用any
和all
這些可用的數據幀的方法,只是要傳遞參數axis=1
到沿操作
例:
df['C4'] = pd.notnull(df).any(axis=1)
C1 C2 C3 C4
0 NaN NaN NaN False
1 20.1 15.0 200.0 True
2 NaN 12.0 100.0 True
3 22.5 8.0 80.0 True
我覺得我們應該使用all
df['New']=~df.isna().all(1)
df
C1 C2 C3 New
1 NaN NaN NaN False
2 20.1 15.0 200.0 True
3 NaN 12.0 100.0 True
4 22.5 8.0 80.0 True
怎么樣:
# interim df
df = {"C1": [False, True, False, True], ...
df ["C4"] = df.apply(lambda x: x.C1 or x.C2 or X.C3, axis=1)
或者...直接作為
original_df["C4"] = original_df.apply(lambda x: np.any(np.isnan(x)), axis = 1)
問候,
您可以使用apply
方法並定義一個函數以將行映射到布爾值。
這是一個函數,您可以根據需要進行自定義(例如,可以使用all
代替any
):
# if at least one of the values is NaN
def my_function(row):
return any(row[['C1', 'C2', 'C3']].isna())
這是將其應用於數據框並添加新列的方法:
df['new_column'] = df.apply(my_function, axis=1)
C1 C2 C3 new_column
0 NaN NaN NaN True
1 20.1 15.0 200.0 False
2 NaN 12.0 100.0 True
3 22.5 8.0 80.0 False
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.