遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列
Posted
技术标签:
【中文标题】遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列【英文标题】:Iterate through rows in pandas dataframe and match tuples from a list and create a new df column 【发布时间】: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
【问题讨论】:
【参考方案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) |
+----+-----+---------+--------+---------+-------+----------+--------+-----------+
【讨论】:
以上是关于遍历 pandas 数据框中的行并匹配列表中的元组并创建一个新的 df 列的主要内容,如果未能解决你的问题,请参考以下文章
Pyspark:如何将现有非空列的元组列表作为数据框中的列值之一返回
Pandas 替换列中的值,但 to_replace 参数是包含元组的元组