【问题标题】:Match strings between two dataframes and create column匹配两个数据框之间的字符串并创建列
【发布时间】:2017-10-01 15:27:15
【问题描述】:

我正在尝试匹配从bad_boygood_boy 的部分字符串,并在原始df (bad_boy) 中创建一个名为Right Address 的列,但很难实现这一目标。我查看了以下链接:

Replace whole string if it contains substring in pandas

Return DataFrame item using partial string match on rows pandas python

import pandas as pd
bad_boy = pd.read_excel('C:/Users/Programming/.xlsx')
df = pd.DataFrame(bad_boy)

print (df['Address'].head(3))

0  1234 Stack Overflow
1  7458 Python
2  8745 Pandas

good_boy = pd.read_excel('C:/Users/Programming/.xlsx')

df2 = pd.DataFrame(good_boy)

print (df2['Address'].head(10))

0 5896 Java Road
1 1234 Stack Overflow Way
2 7459 Ruby Drive
3 4517 Numpy Creek Way
4 1642 Scipy Trail
5 7458 Python Avenue
6 8745 Pandas Lane
7 9658 Excel Road
8 7255 Html Drive
9 7459 Selenium Creek Way

我试过了:

df['Right Address'] = df.loc[df['Address'].str.contains('Address', case = False, na = False, regex = False), df2['Address']]

但这会抛出一个错误:

'None of [0.....all addresses\nName: Address, dtype: object] are in the [columns]'

正在请求结果:

print (df['Right Address'].head(3))

0  1234 Stack Overflow Way
1  7458 Python Avenue
2  8745 Pandas Lane

【问题讨论】:

  • 您的数字列 1234、7458 和 8745 在您的两个数据框中都匹配。您可以加入并保留 df2 名称吗?这会给你想要的结果。还是你需要通过字符串匹配来做到这一点?
  • 那会很好,但是有什么想法吗?

标签: python pandas


【解决方案1】:

您可以使用 merge 结合 str.extract 进行部分匹配

df1 = df1.merge(df2, left_on = df1.Address.str.extract('(\d+)', expand = False), right_on = df2.Address.str.extract('(\d+)', expand = False), how = 'inner').rename(columns = {'Address_y': 'Right_Address'})

你得到

    Address_x           Right_Address
0   1234 Stack Overflow 1234 Stack Overflow Way
1   7458 Python         7458 Python Avenue
2   8745 Pandas         8745 Pandas Lane

【讨论】:

  • 谢谢,当我写df1.to_excel 时,Right_Address 没有出现。 print (df1.columns) 返回Index(['Project', 'Order Date', 'Paid Date', 'Resale Released', 'Estimated Close Date', 'Estimated Sales Price', 'Address', 'Title Company', 'Title Company Email', 'Seller', 'Builder/HO', 'Actual Close Date', 'Actual Sales Price', 'Status of Assessments', 'Closing Received', 'Unnamed: 15', 'Unnamed: 16'], dtype='object')。 Right_Address 不存在。
  • 您是否通过合并分配给 df1 通过执行 df1 = df1.merge...?
  • 解决了地址,但是FutureWarning: currently extract(expand=None) means expand=False (return Index/Series/DataFrame) but in a future version of pandas this will be changed to expand=True (return DataFrame),我尝试做df1.Address.str.extract('(\d+)'expand = False), ...没有用。
  • Expand = False 顺便处理一下警告。我已经编辑了答案
  • @ 不,此解决方案在您的示例中不起作用,因为该解决方案基于 1234、7458 等数字进行匹配,而在您的情况下,您需要匹配字符串
猜你喜欢
  • 1970-01-01
  • 2021-10-18
  • 1970-01-01
  • 2019-01-12
  • 1970-01-01
  • 2011-10-30
  • 2019-03-16
  • 2019-06-04
  • 2014-11-15
相关资源
最近更新 更多