Pandas,Python,Excel,在DF 1列中搜索子字符串以将字符串写入DF2中的列



我正在使用python中的包熊猫来处理和读取和写入Excel电子表格。我创建了 2 个不同的数据帧(df1 和 df2(,它们的单元格都是数据类型字符串。DF1 有超过 50,000 行。df1 的每一列中都有许多单元格是"Nan",我已经转换为一个说"空"的字符串。DF2 有超过 9000 行。"WHSE_Nbr"和"WHSE_Desc_HR"中的每一行都包含一个准确的字符串值。只有某些行在 df2 的最后 2 列中具有字符串"空"以外的值。df1 中的"仓库"列有许多单元格,其中包含仅包含单词的名称。我有兴趣识别的 df1 中"仓库"列的行是包含 df2 中"WHSE_Nbr"列中找到的任何仓库编号的行。

Example of dataframe1 - df1
Job         Warehouse          GeneralDescription      Purpose
Empty       AP                 Accounts Payable        Accounting
Empty       Empty              Empty                   Empty
Empty       Cyber Security GA  Security & Compliance   Data Security
Empty       Merch|04-1854      Empty                   Empty
Empty       WH -1925           Empty                   Empty
Empty       Montreal-10        Empty                   Empty
Empty       canada| 05-4325    Empty                   Empty
Example of dataframe2 - df2

WHSE_Nbr    WHSE_Desc_HR         WHSE_Desc_AD    WHSE_Abrv
1           Technology                           Tech
2           Finance                 
...         ...                 
10          Recruiting           Campus Outreach
1854        Community Relations
...         ...
1925        HumanResources
4325        Global People
9237        International Tech                          

数据帧示例2 DF2

因此,我想遍历 df1 的"仓库列"的所有行,以搜索出现在 df2 WHSE_Nbr列中的 WHSE 编号。在此示例中,我希望我的代码在 df1 的"仓库"列中找到 1854,并将该数字映射到 df2 WHSE_Desc_HR列中的关联单元格,并在 df1 的"常规描述"列中写入"社区关系"(到包含子字符串"1854"的同一行仓库列中。它还会将"人力资源"写入仓库列,在同一行子字符串"1925"出现在仓库列中。当迭代到达"蒙特利尔 10"时,我希望我的代码将"校园外展"写入 df1 的"常规描述"列,因为如果 df2 的WHSE_Desc_AD中有一个值,这将作为 df2 "WHSE_Desc_HR"列中内容的覆盖。我已经足够熟悉熊猫来读取 excel 文件 (.xlsx( 并制作数据框并在数据框中更改数据类型以进行迭代,查看数据框,但无法找出最有效和最有效的方法来构建此代码以实现这一目标。我刚才不得不编辑这个问题,因为我意识到我遗漏了一些非常重要的东西。每当数字出现在"仓库"列中时,我要匹配的数字总是跟在连字符或短划线 (-( 后面。所以在 df1 中,仓库行显示"加拿大 |05-4325"应识别4325,匹配df2,并在df1的"一般描述"列中写入"全球人物"。对不起,伙计们。非常感谢帮助,下面的两个答案是一个很好的开始。谢谢

import pandas as pd
excel_file='/Users/cbri/anaconda3/WHSE_gen.xlsx'
df1 = pd.read_excel(excel_file, usecols [1,5,6,7])
excel_file='/Users/cbri/PycharmProjects/True_Dept/HR_excel.xlsx'
df2 = pd.read_excel(excel_file)
df1=df1.replace(np.nan, "Empty",regex=True)
df2=df2.replace(np.nan, "Empty",regex=True)
df1=pd.DataFrame(df1, dtype='str')
df2=pd.DataFrame(df2, dtype='str')
#yeah i need a push in the right direction, guess i should use ieriterms()?
for column in df1:
if (df1['Warehouse'])    
#so i got as far as returning all records that contained the substring "1854" but obviously that's without the for and if statement above
df1[df1['Warehouse'].str.contains("1854", na=False)]

我要做的是编写一个正则表达式来从您的列中提取数字连接表,也许在 excel 中完成其余的工作......(专栏更新(

df1 = pd.DataFrame({'Department' : ['Merch - 1854', '1925 - WH','Montreal 10'],'TrueDeparment' : ['Empty','empty','empty']})
df2 = pd.DataFrame({'Dept_Nbr' : [1854, 1925, 10], 'Dept_Desc_HR' : ['Community Relations','Human Resources','Recruiting']})

然后在这里你可以尝试这个函数的作用:

line = 'Merch - 1854 '
match = re.search(r'[0-9]+', line)
if match is None:
print(0)
else:
print(int(match[0]))

如果您需要在注释中指定的字符之后进行匹配,请使用以下命令:

line = '12125 15151 Merch -1854 '
match = re.search(r'(?<=-)[0-9]+', line)
if match is None:
print(0)
else:
print(int(match[0]))

请注意,如果"-"后面有空格或其他字符,则需要将其添加到正则表达式中才能工作!

重要 - 你假设你的文本中只有一个数字 - 如果没有,它返回 0,你可以根据需要更改它,重点是至少它不会失败

编写函数:

def extract_number(field):
match = re.search(r'(?<=-)[0-9]+', field)
if match is None:
return 0
else:
return int(match[0])

应用于数据帧:

df1['num_col'] = df1[['Department']].apply(lambda row:extract_number(row['Department']),axis=1)

最后做连接:

df1.merge(df2, left_on = ['num_col'], right_on = ['Dept_Nbr'])

从这里你可以确定你需要哪一列,无论是在Python中还是在excel中。

试试这个:

numbers = df2['Dept_Nbr'].tolist()
df2['Dept_Nbr'] = [int(i) for i in df2['Dept_Nbr']]
df2.set_index('Dept_Nbr')
for n in numbers:
for i in df1.index:
if n in df1.at[i, 'Department']:
if df2.at[int(n), 'Dept_Desc_AD']: #if values exists
df1.at[i, 'TrueDepartment'] = df2.at(int(n), 'Dept_Desc_AD')
else:
df1.at[i, 'TrueDepartment'] = df2.at(int(n), 'Dept_Desc_HR')

相关内容

最新更新