Python 从另一个数据帧列中的另一个单词列表中删除数据帧列中每一行中的单词

Python 从另一个数据帧列中的另一个单词列表中删除数据帧列中每一行中的单词,python,pandas,dataframe,text,pyspark,Python,Pandas,Dataframe,Text,Pyspark,我想从每行的另一个数据帧中减去或删除一个数据帧中的单词 这是pyspark数据帧的主表/列 +----------+--------------------+ | event_dt| cust_text| +----------+--------------------+ |2020-09-02|hi fine i want to go| |2020-09-02|i need a line hold | |2020-09-02|i have the 60 packs|

我想从每行的另一个数据帧中减去或删除一个数据帧中的单词

这是pyspark数据帧的主表/列

+----------+--------------------+
|  event_dt|           cust_text|
+----------+--------------------+
|2020-09-02|hi fine i want to go|
|2020-09-02|i need  a line hold |
|2020-09-02|i have the  60 packs|
|2020-09-02|hello want you teach|
+-------+
|column1|
+-------+
|   want|
|because|
|   need|
|  hello|
|      a|
|   have|
|     go|
+-------+
下面是另一个pyspark数据帧。此数据框中的单词需要从上述主表的
cust_text
列中删除,无论这些单词出现在每行的哪个位置。例如,“want”将从第1个数据帧中显示的每一行中删除

+----------+--------------------+
|  event_dt|           cust_text|
+----------+--------------------+
|2020-09-02|hi fine i want to go|
|2020-09-02|i need  a line hold |
|2020-09-02|i have the  60 packs|
|2020-09-02|hello want you teach|
+-------+
|column1|
+-------+
|   want|
|because|
|   need|
|  hello|
|      a|
|   have|
|     go|
+-------+
这可以在pyspark或pandas中完成。我曾尝试使用Python、Pyspark和pandas在谷歌上搜索解决方案,但仍然无法基于单列表从主表中删除单词

结果应该如下所示:

+----------+--------------------+
|  event_dt|           cust_text|
+----------+--------------------+
|2020-09-02|hi fine i to        |
|2020-09-02|i line hold         |
|2020-09-02|i the 60 packs      |
|2020-09-02|you teach           |
+----------+--------------------+

这种解决方案将针对熊猫。如果我正确理解您的挑战,您希望删除第二个数据帧的
column1
列中出现的
cust_text
中的所有单词。让我们为相应的数据帧指定名称:
df1
df2
。以下是您将如何做到这一点:

for i in range(len(df1)):
    sentence = df1.loc[i, "cust_text"]
    for j in range(len(df2)):
        delete_word = df2.loc[j, "column1"]
        if delete_word in sentence:
            sentence = sentence.replace(delete_word, "")
    df1.loc[i, "cust_text"] = sentence

我为这些数据帧中的某些数据点分配了变量(
句子
删除单词
),但这只是为了理解。通过不这样做,您可以很容易地将此代码压缩为几行更短的代码。

如果您只想删除df2对应行中的单词,您可以按如下方式进行操作,但对于大型数据集,这可能会很慢,因为它只能部分使用快速C实现:

# define your helper function to remove the string
def remove_string(ser_row):
    return ser_row['cust_text'].replace(ser_row['remove'], '')

# create a temporary column with the string to remove in the first dataframe
df1['remove']= df2['column1']
df1= df1.apply(remove_string, axis='columns')
# drop the temporary column afterwards
df1.drop(columns=['remove'], inplace=True)
结果如下:

Out[145]: 
0        hi fine i  to go
1    i need   lines hold 
2    i have the  60 packs
3           can you teach
dtype: object
但是,如果要从每一列中删除df2列中的所有单词,则需要进行不同的操作。不幸的是,
str.replace
在这里对常规字符串没有帮助,除非您想为第二个数据帧中的每一行调用它。 因此,如果第二个数据帧不是太大,可以创建一个正则表达式来使用
str.replace

import re
replace=re.compile(r'\b(' + ('|'.join(df2['column1'])) + r')\b')
df1['cust_text'].str.replace(replace, '')
输出为:

Out[184]: 
0      hi fine i  to 
1    i    lines hold 
2    i  the  60 packs
3       can you teach
Name: cust_text, dtype: object
如果您不喜欢保留的重复空格,可以执行以下操作:

df1['cust_text'].str.replace(replace, '').str.replace(re.compile('\s{2,}'), ' ')
补充:如果不仅没有词语的文本是相关的,而且词语本身也是相关的,那该怎么办呢。我们怎样才能得到被替换的单词呢。这里是一个尝试,如果可以识别一个字符,它将不会出现在文本中。假设此字符是
@
,则可以执行以下操作(在不替换的原始列值上):


是的,这就是我想要的。如何定义数据帧的长度?-->for i in range(len(df1)):df1有两列-event_dt,cust_text。从技术上讲,数据帧应该始终具有相同的行数,而不管它有多少列。将其视为1行1项,其中包含有关dataframe中所有特性(也称为列)的信息。也就是说,您可以通过
len(dataframe)
访问任何数据帧的长度(即行数)。这是一个内置的python函数。第二个数据帧(df2)有go,需要从第一个数据帧(df1)中删除。在您的输出中,我看到“go”并没有从第一个数据帧中删除。您好,不客气。我认为,第二个数据帧中的行与第一个数据帧中的行相对应,您只想删除属于同一行的字符串。顺便说一句,你来自印度吗?不。我想我解释不清楚。这是我第一次问任何问题。没问题,我想我有一个解决办法。请稍等。最后一件事,我想在结果中添加'event_dt'列以及相应的行(原样)