为整个分析列的.apply编写函数?

时间:2016-12-15 18:09:00

标签: python pandas dataframe

我有一个数据框(它是使用pivot函数的产物,这就是为什么它有c和a):

c 367235    419895  992194
a
1999-02-06  Nan 9   Nan
2000-04-03  2   Nan Nan
1999-04-12  Nan Nan 4
1999-08-08  2   Nan Nan
1999-11-01  8   5   1
1999-12-08  Nan 3   Nan
1999-08-17  Nan Nan 10
1999-10-22  Nan 3   Nan
1999-03-23  Nan 4   Nan
2000-09-29  9   Nan Nan
1999-04-30  Nan Nan 1
2000-09-30  9   Nan Nan

我想在此数据框的底部添加一个新行。新行中的每个单元格将评估其上方的列;如果列包含数字9,8或3,则单元格将评估为" TRUE"。如果列不包含这些数字,则单元格将评估为" FALSE"。最终,我的目标是使用" FALSE"删除列。使用drop函数创建一个数据集,如下所示:

c 367235    419895
a
1999-02-06  Nan 9
2000-04-03  2   Nan
1999-04-12  Nan Nan
1999-08-08  2   Nan 
1999-11-01  8   5
1999-12-08  Nan 3
1999-08-17  Nan Nan
1999-10-22  Nan 3   
1999-03-23  Nan 4
2000-09-29  9   Nan
1999-04-30  Nan Nan
2000-09-30  9   Nan
           TRUE TRUE

我的问题:

我可以编写一个函数来评估列表中是否有多个数字,但我不能将此函数写入.apply。

也就是说,我发现这可用于确定一组数字是否在列表中:

  

How to check if one of the following items is in a list?

我尝试对apply函数进行如下修改:

def BIS(i):
        L1 = [9,8,3]
        if i in L1:
            return "TRUE"
    else:
        return "FALSE"
df_wanted.apply(BIS, axis = 0)

这会导致错误:     ('系列的真值是不明确的。使用a.empty,a.bool(),a.item,a.any()。' u'出现在索引367235' )

这使我认为虽然.apply将整列作为输入,但它无法聚合所有单个单元格的真值,并提出有关该列的总真值。我抬头看了a.any和a.bool,看起来非常有用,但我不知道在哪里贴他们?例如,这没有用:

df_wanted.apply.any(BIS, axis = 0)

也没有这个

df_wanted.apply(BIS.any, axis = 0).

有人能指出我正确的方向吗?非常感谢提前

1 个答案:

答案 0 :(得分:1)

您可以使用.isin()方法:

df.loc[:, df.isin(['9','8','3']).any()]

enter image description here

如果您需要将条件附加到数据框:

cond = df.isin(['9','8','3']).any().rename("cond")
df.append(cond).loc[:, cond]

enter image description here