我有一个dataframe,基于名为"originator“的列中的字符串,我想检查该字符串是否有驻留在另一个列表中的单词。如果字符串中有一个位于上述列表中的单词,则将列originator_prediction更新为"org“。
有没有更好的方法来做这件事?我用下面的方法做了,但是很慢。
for row in df['ORIGINATOR'][1:]:
string = str(row)
splits = string.split()
for word in splits:
if word in COMMON_ORG_UNIGRAMS_LIST:
df['ORGINATOR_PREDICTION'] = 'Org'
else:
continue
df = pd.DataFrame({'ORIGINATOR': ['JOHN DOE', 'APPLE INC', 'MIKE LOWRY'],
'ORGINATOR_PREDICTION': ['Person', 'Person','Person']})
COMMON_ORG_UNIGRAMS_LIST = ['INC','LLC','LP']
具体地说,如果您查看数据框中的第2行,"APPLE INC“应该有一个originator_prediction = 'ORG‘而不是person。
原因是,我们循环通过我们共同的组织单字表,单词INC就在其中。
发布于 2020-09-28 19:54:32
您的代码不会给出正确的结果,因为在使用df['ORGINATOR_PREDICTION'] = 'Org'
进行每次检查之后,您会将该列中的所有行都赋给该值。这将导致该列中的所有行都具有值Org
。另外,我不明白为什么要在循环中添加[1:]
。如果您试图避免使用列名,则它不会选择列名。我已经对你的代码做了一些修改,它可以正常工作
org_or_person_list = []
for row in df['ORIGINATOR']:
splits = row.split()
org_or_person_list.append('Org' if set(splits) & set(COMMON_ORG_UNIGRAMS_LIST) else 'Person')
df['ORGINATOR_PREDICTION'] = org_or_person_list
输出:
ORIGINATOR ORGINATOR_PREDICTION
0 JOHN DOE Person
1 APPLE INC Org
2 MIKE LOWRY Person
发布于 2020-09-28 19:51:43
尝试一下,使用带有contains
方法的.str
、string访问器。我们可以使用join
为字符串列表创建正则表达式:
df.loc[df['ORIGINATOR'].str.contains('|'.join(COMMON_ORG_UNIGRAMS_LIST)), 'ORGINATOR_PREDICTION'] = 'Org'
输出:
ORIGINATOR ORGINATOR_PREDICTION
0 JOHN DOE Person
1 APPLE INC Org
2 MIKE LOWRY Person
完整代码:
df = pd.DataFrame({'ORIGINATOR': ['JOHN DOE', 'APPLE INC', 'MIKE LOWRY'],
'ORGINATOR_PREDICTION': ['Person', 'Person','Person']})
COMMON_ORG_UNIGRAMS_LIST = ['INC','LLC','LP']
df.loc[df['ORIGINATOR'].str.contains('|'.join(COMMON_ORG_UNIGRAMS_LIST)),'ORGINATOR_PREDICTION'] = 'Org'
print(df)
发布于 2020-09-28 20:11:11
替代解决方案:
df = pd.DataFrame({
'ORIGINATOR': ['JOHN DOE', 'APPLE INC', 'MIKE LOWRY'],
'ORIGINATOR_PREDICTION': ['Person', 'Person','Person']
})
COMMON_ORG_UNIGRAMS_LIST = ['INC','LLC','LP']
df.loc[df['ORIGINATOR'].apply(lambda x: len(set(x.split(' ')) & set(COMMON_ORG_UNIGRAMS_LIST)) > 0), 'ORIGINATOR_PREDICTION'] = 'Org'
https://stackoverflow.com/questions/64108469
复制相似问题