根据行中的其他列设置熊猫列布尔值

时间:2019-08-22 01:50:14

标签: python pandas dataframe

假设一个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列的代码;我似乎无法用真值创建新列。

4 个答案:

答案 0 :(得分:1)

您可以使用数据帧上可用的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

答案 1 :(得分:1)

我觉得我们应该使用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

答案 2 :(得分:0)

怎么样:

# 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)

关于

答案 3 :(得分:0)

您可以使用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