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 判断某一列数据是不是在另一列中的主要内容,如果未能解决你的问题,请参考以下文章

excel如何判断某一列内容是不是包含在另一列中

Python Pandas:按一列分组,仅在另一列中聚合,但取相应数据

Pandas:根据字符串的一部分是不是在另一列中的任何位置创建新列

Pandas,对于一列中的每个唯一值,在另一列中获取唯一值

关于Excel判断一列数据是不是在另一列中存在,并且把存在的数据提取出来

excel中判断一个表中的某一列的数据在另一个表中的某一列中是不是存在