遍历pandas数据框中的行并匹配列表中的元组并创建新的df列

时间:2020-08-24 19:17:16

标签: python pandas list for-loop tuples

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

    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

2 个答案:

答案 0 :(得分:0)

您可以使用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()的熊猫文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.map.html

答案 1 :(得分:0)

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)   |
+----+-----+---------+--------+---------+-------+----------+--------+-----------+