簡體   English   中英

根據行中的其他列設置熊貓列布爾值

[英]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列的代碼; 我似乎無法用真值創建新列。

你可以做,使用anyall這些可用的數據幀的方法,只是要傳遞參數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.

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