问题描述
我有一个带有一列元组(df.row_col)的数据框,我需要使用元组列表进行搜索。如果dataframe列中存在该列表中的元组,我想返回该行并将新列添加到dataframe中。我尝试了此列表理解,但是不确定是否可以遍历这样的列表。非常感谢您的帮助!
data_tuples=
[(7,45),(13,34),(17,51),52),53),54),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
解决方法
您可以使用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
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) |
+----+-----+---------+--------+---------+-------+----------+--------+-----------+