根据其他列更新列值

3

我对Pandas的理解比较薄弱,对Python也不是很熟悉。

我想要根据现有列(d.Companyd2.Alias)的值来更新一个列(d.Alias)。如果d2.Aliasd.Company的子字符串,则d.Alias应该等于d2.Alias

数据集示例:

d = {'Company': ['The Cool Company Inc', 'Cool Company, Inc', 'The Cool 
        Company', 'The Shoe Company', 'Muffler Store', 'Muffler Store'],
    'Position': ['Cool Job A', 'Cool Job B', 'Cool Job C', 'Salesman', 
        'Sales', 'Technician'],
    'City': ['Tacoma', 'Tacoma','Tacoma', 'Boulder', 'Chicago', 'Chicago'],
    'State': ['AZ', 'AZ', 'AZ', 'CO', 'IL', 'IL'],
    'Alias': [np.nan, np.nan, np.nan, np.nan, np.nan, np.nan]}
d2 = {'Company': ['The Cool Company, Inc.', 'The Shoe Company', 'Muffler 
         Store LLC'],
    'Alias': ['Cool Company', np.nan, 'Muffler'],
    'First Name': ['Carol', 'James', 'Frankie'],
    'Last Name': ['Fisher', 'Smith', 'Johnson']}
np.nan 对于 The Shoe Company 来说不需要使用别名。我尝试过使用 .locfor 循环、while 循环、pandas.wherenumpy.where 等多种方法,但都没有得到期望的结果。在使用 for 循环时,d2.Alias 的末尾被复制到了 d.Alias 的所有行中。然而,我无法重现这个结果。
我查看了之前的帖子,但是要么无法让它们工作,要么我无法理解它们:Conditionally fill column with value from another DataFrame based on row match in Pandas pandas create new column based on values from other columns
非常感谢任何帮助!
编辑: 期望输出:Expected output 更新: 调整几天后,我达到了所需的结果。根据 Wen 的回答,我必须更改一些东西。首先,我从 df2.Alias 创建了一个名为 aliases 的列表:aliases = df2.Alias.unique()。然后,我需要删除 .map(df2.set_index('Company').Alias。生成我的所需结果的代码行:df1['Alias'] = df1.Company.apply(lambda x: [process.extract(x, aliases, limit=1)][0][0][0])

你能给我们提供期望的输出吗?我不太清楚你所说的“如果d2.Alias包含在d.Company中”是什么意思。 - harvpan
这些是数据框吗? - BENY
1
新增了一个输出,并将“If d2.Alias is contained in d.Company”更改为@HarvIpan。 - Chris
@Wen 是的,那些就是数据框。 - Chris
2个回答

2
一种方法是循环遍历您的较小数据框,并查看别名是否是d.Company的子字符串,然后将别名替换为该字符串。
import pandas as pd
d = pd.DataFrame(d)
d2 = pd.DataFrame(d2)

for row in d2[d2.Alias.notnull()].itertuples():
    d.loc[d.Company.str.contains(row.Alias), 'Alias'] = row.Alias

print(d)
#          Alias     City               Company    Position State
#0  Cool Company   Tacoma  The Cool Company Inc  Cool Job A    AZ
#1  Cool Company   Tacoma     Cool Company, Inc  Cool Job B    AZ
#2  Cool Company   Tacoma      The Cool Company  Cool Job C    AZ
#3           NaN  Boulder      The Shoe Company    Salesman    CO
#4       Muffler  Chicago         Muffler Store       Sales    IL
#5       Muffler  Chicago         Muffler Store  Technician    IL

1
我建议使用 df.itertuples 而不是 df.iterrows 来提高性能;除此之外,这看起来很好 +1。 - jpp
谢谢您的帮助。当我尝试时,“The Cool Company”的行中没有任何“Alias”。不过其他行似乎都工作得很好。 - Chris

2
< p >来自< code > fuzzywuzzy 的解决方案
from fuzzywuzzy import process

df1['Alias']=df1.Company.apply(lambda x :[process.extract(x, df2.Company, limit=1)][0][0][0]).map(df2.set_index('Company').Alias)
df1
Out[31]: 
          Alias     City               Company    Position State
0  Cool Company   Tacoma  The Cool Company Inc  Cool Job A    AZ
1  Cool Company   Tacoma     Cool Company, Inc  Cool Job B    AZ
2  Cool Company   Tacoma      The Cool Company  Cool Job C    AZ
3           NaN  Boulder      The Shoe Company    Salesman    CO
4       Muffler  Chicago         Muffler Store       Sales    IL
5       Muffler  Chicago         Muffler Store  Technician    IL

感谢您向我介绍 fuzzywuzzy +1。 - harvpan
@Cwf2018:-)愉快编程 - BENY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接