【问题标题】:membership test in pandas data frame column熊猫数据框列中的成员资格测试
【发布时间】:2017-07-05 05:53:28
【问题描述】:

我有一个熊猫数据框,其中一列是列表。请看下面:

>>> a.head
    C1  C2
0   23  [2,4,5,8,1]
1   24  [1,2]
2   15  [-2]
3   19  [1,3,4,5,6,7,8,9,0]

我想在 C2 中找到包含 6 的行并返回 C1 中的值。我想像

b = a["C1"][(6 in a["C2"])]
return(int(b))

但它不起作用。 谢谢。

【问题讨论】:

    标签: python list pandas contains membership


    【解决方案1】:

    对于内置 Pandas 方法,请尝试isin

    Pandas 列,Series 对象,有一个名为 isinmethod 用于此类事情。它返回一个位置boolean Series(掩码)。它会在您的列中找到给定列表中的值。

    s = pd.Series(['lama', 'cow', 'lama', 'beetle', 'lama',
                   'hippo'], name='animal')
    s.isin(['cow', 'lama'])
    0     True
    1     True
    2     True
    3    False
    4     True
    5    False
    

    【讨论】:

    • 这与 OP 的要求相反。这不是如何在给定列表中测试列的成员资格;这是如何测试值的成员资格在列表列中
    【解决方案2】:

    我认为您需要applyin 来测试list 中的值以创建boolean mask

    print (a.C2.apply(lambda x: 6 in x))
    0    False
    1    False
    2    False
    3     True
    Name: C2, dtype: bool
    

    然后使用locboolean indexingmask 选择:

    b = a.loc[a.C2.apply(lambda x: 6 in x), 'C1']
    print (b)
    3    19
    Name: C1, dtype: int64
    

    如果需要,最后一个标量输出转换为numpy array 并通过[] 选择第一个值:

    print (b.values)
    [19]
    
    print (b.values[0])
    19
    

    或者使用iatiloc

    print (b.iat[0])
    19
    
    print (b.iloc[0])
    19
    

    【讨论】:

    • FWIW,apply 通常比执行相同操作的内置方法方式慢。
    • @ringo - 我同意,但这里的测试列 C2 填充了列表,所以 isin 失败,因为 isin 工作于由标量填充的测试列,例如 C1。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-02
    相关资源
    最近更新 更多