从不在列表中的每行数据框中的列中删除字符串

Posted

技术标签:

【中文标题】从不在列表中的每行数据框中的列中删除字符串【英文标题】:Remove Strings from Column in data frame per row that aren't in a list 【发布时间】:2019-08-01 03:38:00 【问题描述】:

假设我有一个单词列表:

listOfWords = ['Apple','Orange','Banana','Potato']

我的数据框如下所示:

In:

ColumnA:
['Apple','Turnip','Banana','Potato']
['Apple','Orange','Banana','Potato']
['Apple','Orange','Pastry','Potato']
['Melon','Orange','Banana','Potato']
['Apple','Orange','Banana','Sandwich']

我目前正在运行以下代码来检索所需的输出

for index, row in df.iterrows():
    for word in df['Column']:
        if word not in listOfWords:
            word.replace(word,"")



Out:

ColumnA:
    ['Apple','Banana','Potato']
    ['Apple','Orange','Banana','Potato']
    ['Apple','Orange','Potato']
    ['Orange','Banana','Potato']
    ['Apple','Orange','Banana']

我目前正在对 12,000 条记录和长度为 12,000 的列表运行此操作。它已经运行了几个小时没有错误,但是我不确定这是否是最有效的方法。

【问题讨论】:

【参考方案1】:

apply 或嵌套list comprehension 中使用列表推导:

df['ColumnA']= df['ColumnA'].apply(lambda x: [y for y in x if y in listOfWords]) 
#another solution
#df['ColumnA'] = [[y for y in x if y in listOfWords] for x in df['ColumnA']]
print (df)
                           ColumnA
0          [Apple, Banana, Potato]
1  [Apple, Orange, Banana, Potato]
2          [Apple, Orange, Potato]
3         [Orange, Banana, Potato]
4          [Apple, Orange, Banana]

或者如果订单不重要,请使用 sets 和交集:

s = set(listOfWords)
df['ColumnA']= df['ColumnA'].apply(lambda x: list(set(x) & s))
print (df)
                           ColumnA
0          [Banana, Potato, Apple]
1  [Banana, Potato, Orange, Apple]
2          [Potato, Orange, Apple]
3         [Banana, Potato, Orange]
4          [Banana, Orange, Apple]

【讨论】:

以上是关于从不在列表中的每行数据框中的列中删除字符串的主要内容,如果未能解决你的问题,请参考以下文章

从数据框中删除不包括一组列的列中的nan行。

删除列表中数据框中的列

从 pyspark 数据框中的列中提取特定字符串

如何从python中的pandas数据框中的列中提取关键字(字符串)

Spark基于其他数据框中的列对数据框中的列进行重复数据删除

如果子字符串列表中的任何值包含在数据框中的任何列中,则过滤行