【问题标题】:Return rows in pandas dataframe where tuple in column contains a certain value返回 pandas 数据框中的行,其中列中的元组包含某个值
【发布时间】:2015-04-05 22:45:51
【问题描述】:

我正在尝试在 pandas 数据框中查询其中一列包含包含特定值的元组的行。

举个例子:

   User                 Col1
0     1     (cat, dog, goat)
1     1         (cat, sheep)
2     1        (sheep, goat)
3     2          (cat, lion)
4     2  (fish, goat, lemur)
5     3           (cat, dog)
6     4          (dog, goat)
7     4                  cat

所以假设我想返回 Col1 包含“cat”的行,有没有办法在不遍历每一行并执行“if”(我的实际数据集有更多行)的情况下做到这一点?

df['Col1'].isin(['cat'])

df['Col1'].str.contains("cat")

只为最后一行返回“真”

【问题讨论】:

    标签: python pandas tuples dataframe


    【解决方案1】:

    您可以在apply() 中使用 lambda 函数:

    df[df["Col1"].apply(lambda x: True if "cat" in x else False)]
    

    "cat" 在单元格中时,lambda 返回True。这适用于字符串("cat" in "cat"True)和元组("cat" in ("cat", "dog")True)。通过对 df 进行子集化,您可以获得 lambda 为 True 的所有行。

    【讨论】:

    • 你为我省去了很多烦恼。谢谢!
    • 很高兴能帮上忙!
    【解决方案2】:

    为什么不对数据框进行子集化,然后输出结果?

    catdf = df[df['Col1'].str.contains("cat")]
    

    【讨论】:

      【解决方案3】:

      您的 DataFrame 列包含字符串和元组的混合。我不认为你可以避免迭代列。但是您可以使用 apply 方法有效地迭代。示例代码如下。

      import pandas as pd
      
      # fake data - in a Series for simplicity
      tlist = [('cat', 'dog', 'goat'),
          ('cat', 'sheep'),
          ('sheep', 'goat'),
          ('cat', 'lion'),
          ('fish', 'goat', 'lemur'),
          ('cat', 'dog'),
          ('dog', 'goat'),
          'cat']
      s = pd.Series(tlist)
      
      # iterate Series with a lambda function searching for 'cat'
      s.apply(lambda x: 'cat' in x)
      

      这给了我以下输出

      Out[38]: 
      0     True
      1     True
      2    False
      3     True
      4    False
      5     True
      6    False
      7     True
      dtype: bool
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2022-11-11
        • 2018-03-28
        • 1970-01-01
        • 2021-06-01
        • 1970-01-01
        • 2020-11-24
        相关资源
        最近更新 更多