假设一个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列的代码;我似乎无法用真值创建新列。
答案 0 :(得分:1)
您可以使用数据帧上可用的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
答案 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