【问题标题】:Update column values based on other columns根据其他列更新列值
【发布时间】:2018-06-01 03:21:03
【问题描述】:

我对 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']}

The Shoe Companynp.nan 是因为在这种情况下不需要别名。

我尝试过使用.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

更新:
经过几天的修补,我达到了预期的结果。有了温的回应,我不得不改变一些事情。

首先,我从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 中”是什么意思
  • 是那些数据框吗?
  • 添加了一个结果并更改了“如果 d2.Alias 包含在 d.Company 中”@HarvIpan
  • @Wen 是的,这些是数据框

标签: python pandas


【解决方案1】:

来自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。
  • @Cwf2018 yw:-)快乐编码
【解决方案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

【讨论】:

  • 我推荐df.itertuples而不是df.iterrows以获得性能;否则这看起来不错 +1。
  • 感谢您的帮助。当我尝试这个时,'The Cool Company' 的行在'Alias' 中没有任何内容。其他行似乎工作得很好。
猜你喜欢
  • 1970-01-01
  • 2021-10-19
  • 2022-08-18
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多