【问题标题】:Iterate through rows in pandas dataframe and match tuples from a list and create a new df column遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列
【发布时间】:2020-12-13 11:15:58
【问题描述】:

我有一个包含一列元组 (df.row_col) 的数据框,我需要使用元组列表进行搜索。如果列表中的元组存在于数据框列中,我想返回该行并向数据框添加一个新列。我尝试了这个列表理解,但我不确定我是否可以遍历这样的列表。非常感谢您的帮助!

    data_tuples= 
    
        [(7, 45),
         (13, 34),
         (17, 51),
         (17, 52),
         (17, 53),
         (17, 54),
         (17, 55),
         (18, 50)]
    Dataframe to search:
        index   farm    layer   row column  Qmax    row_col
        0   1   1   3   7   36  0.0 (7, 36)
        1   2   1   3   7   37  0.0 (7, 37)
        2   3   1   3   8   35  0.0 (8, 35)
        3   4   1   3   8   36  0.0 (8, 36)
        4   5   1   3   8   37  0.0 (8, 37)

for tup in data_tuples:
    new_df = df[df["row_col"].apply(lambda x: True if tup in x else False)]
    return new_df

【问题讨论】:

    标签: python pandas list for-loop tuples


    【解决方案1】:

    您可以使用Series.map(...) 来完成您想做的事情。首先,您可以根据元组是否存在于data_tuples 中创建布尔掩码(True/False 列):

    tuple_present_in_list = df["row_col"].map(lambda x: x in data_tuples)
    

    然后,您可以将原始 DataFrame 过滤到仅这些行(如果您正在尝试这样做):

    new_df = df[tuple_present_in_list]
    

    这里的关键是.map() 将您的逻辑应用于单个列(这是一个熊猫系列)以检查每个“row_col”值以查看它是否在您的元组列表中。

    这里是另一个关于apply和map区别的答案:Difference between map, applymap and apply methods in Pandas

    这是 .map() 的 pandas 文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.map.html

    【讨论】:

      【解决方案2】:

      isin 让您检查值是否在列表(或可迭代)对象中

      例如 如果您有以下情况:

      data_tuples = [
               (8, 36),
               (7, 37)
      ]
      
      df
      +----+-----+---------+--------+---------+-------+----------+--------+-----------+
      |    |   a |   index |   farm |   layer |   row |   column |   Qmax | row_col   |
      |----+-----+---------+--------+---------+-------+----------+--------+-----------|
      |  0 |   0 |       1 |      1 |       3 |     7 |       36 |      0 | (7, 36)   |
      |  1 |   1 |       2 |      1 |       3 |     7 |       37 |      0 | (7, 37)   |
      |  2 |   2 |       3 |      1 |       3 |     8 |       35 |      0 | (8, 35)   |
      |  3 |   3 |       4 |      1 |       3 |     8 |       36 |      0 | (8, 36)   |
      |  4 |   4 |       5 |      1 |       3 |     8 |       37 |      0 | (8, 37)   |
      +----+-----+---------+--------+---------+-------+----------+--------+-----------+
      

      那么我们就可以使用isin函数了

      df[df["row_col"].isin(data_tuples)]
      
      +----+-----+---------+--------+---------+-------+----------+--------+-----------+
      |    |   a |   index |   farm |   layer |   row |   column |   Qmax | row_col   |
      |----+-----+---------+--------+---------+-------+----------+--------+-----------|
      |  1 |   1 |       2 |      1 |       3 |     7 |       37 |      0 | (7, 37)   |
      |  3 |   3 |       4 |      1 |       3 |     8 |       36 |      0 | (8, 36)   |
      +----+-----+---------+--------+---------+-------+----------+--------+-----------+
      

      【讨论】:

        猜你喜欢
        • 2020-04-28
        • 2021-09-20
        • 1970-01-01
        • 2018-09-05
        • 2020-11-08
        • 2021-02-21
        • 2021-04-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多