pandas 判断某一列数据是不是在另一列中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pandas 判断某一列数据是不是在另一列中相关的知识,希望对你有一定的参考价值。
参考技术A 判断某一列数据是否在另一列中是数据处理时的常用操作,假设某dataframe中有两列数据假设要判断cities2列中的数据是否也在cities1列中,首先想到的应该是in 或者 not in。
然而这显然是不行的
整列不行,那么自然想到的是df.apply方法
很不幸,依然报错
这是由于apply默认axis=0,即是按列进行操作,而我们是需要按行操作,故得加上axis=1
这次运行没有错误,但是得到的结果不是我们想要的,因为以上语句的效果是依次比对每行的数据,故得不到我们想要的结果
至此,我们终于得到了想要的结果,即找出了包含在了cities1列中的cities2列中的数据。
同时我们也可以添加一列用于存取比对的结果:
结果如下:
Pyspark 在另一列中的一列中查找模式
【中文标题】Pyspark 在另一列中的一列中查找模式【英文标题】:Pyspark finding pattern in one column in the other column 【发布时间】:2019-08-22 06:58:07 【问题描述】:我有一个包含两列地址和街道名称的数据框。
from pyspark.sql.functions import *
import pyspark.sql
df = spark.createDataFrame([\
['108 badajoz road north ryde 2113, nsw, australia', 'north ryde'],\
['25 smart street fairfield 2165, nsw, australia', 'smart street']
],\
['address', 'street_name'])
df.show(2, False)
+------------------------------------------------+---------------+
|address |street_name |
+------------------------------------------------+---------------+
|108 badajoz road north ryde 2113, nsw, australia|north ryde |
|25 smart street fairfield 2165, nsw, australia |smart street |
+------------------------------------------------+---------------+
我想查找street_name
是否存在于address
中,并在新列中返回一个布尔值。我可以像下面这样手动搜索模式。
df.withColumn("new col", col("street").rlike('.*north ryde.*')).show(20,False)
----------------------------------------------+---------------+-------+
|address |street_name |new col|
+------------------------------------------------+------------+-------+
|108 badajoz road north ryde 2113, nsw, australia|north ryde |true |
|25 smart street fairfield 2165, nsw, australia |smart street|false |
+------------------------------------------------+------------+-------+
但我想将手动值替换为street_name
列,如下所示
df.withColumn("new col", col("street")\
.rlike(concat(lit('.*'),col('street_name'),col('.*))))\
.show(20,False)
【问题讨论】:
【参考方案1】:您可以通过简单地使用contains
函数来做到这一点。更多详情请参考this:
from pyspark.sql.functions import col, when
df = df.withColumn('new_Col',when(col('address').contains(col('street_name')),True).otherwise(False))
df.show(truncate=False)
+------------------------------------------------+------------+-------+
|address |street_name |new_Col|
+------------------------------------------------+------------+-------+
|108 badajoz road north ryde 2113, nsw, australia|north ryde |true |
|25 smart street fairfield 2165, nsw, australia |smart street|true |
+------------------------------------------------+------------+-------+
【讨论】:
在这种情况下,这是最好的解决方案。【参考方案2】:一个简单的解决方案是定义一个UDF
并使用它。例如,
from pyspark.sql.functions import udf
def contains_address(address, street_name):
return street_name in address
contains_address_udf = udf(contains_address, BooleanType())
df.withColumn("new_col", contains_address_udf("address", "street_name")
在这里,可以简单地使用in
,但如果需要更复杂的功能,只需将其替换为正则表达式即可。
【讨论】:
【参考方案3】:只需使用expr
函数:
from pyspark.sql import functions as F
df.select(
"address",
"street_name",
F.expr("address like concat('%',street_name,'%')")
).show()
+--------------------+------------+--------------------------------------+
| address| street_name|address LIKE concat(%, street_name, %)|
+--------------------+------------+--------------------------------------+
|108 badajoz road ...| north ryde| true|
|25 smart street f...|smart street| true|
+--------------------+------------+--------------------------------------+
【讨论】:
以上是关于pandas 判断某一列数据是不是在另一列中的主要内容,如果未能解决你的问题,请参考以下文章
Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据
Pandas:根据字符串的一部分是不是在另一列中的任何位置创建新列