根据另一个数据框编辑列值的内容

Editing the content of column values based on another dataframe

我有这些数据框:

df_1 = 
    Col1             Col2      Col3
0   2021-01-02       A200      strings1
1   2021-01-03       B300      strings4
2   2021-01-05       A201      strings5
3   2021-01-22       B602      strings7
4   2021-01-09       B203      strings6

df_2 =

   Material     Description
0       200            N600
1       300            N500
2       201            N900
3       602            N800
4       700            N801

我想把正确的字母放在 Material 号码前面。我所做的是删除 Col2 内容前面的字母,创建一个额外的列,说明它曾经是 A 还是 B,然后将其添加到Material。但当然它效率很低,当某些材质不在 Col2 中时我会遇到问题,反之亦然。我想要的是:

df_2 =

    Material     Description
0       A200            N600
1       B300            N500
2       A201            N900
3       B602            N800

还有其他方法吗?

在字典中使用 Series.map - 如果需要 select 最后一场比赛:

d = dict(zip(df_1['Col2'].str[1:].astype(int), df_1['Col2']))
df_2['Material'] = df_2['Material'].map(d)

df_2 = df_2.dropna(subset=['Material'])
print (df_2)
  Material Description
0     B200        N600
1     B300        N500
2     A201        N900
3     B602        N800

如果需要先匹配映射:

df = df_1.assign(new = df_1['Col2'].str[1:].astype(int)).drop_duplicates('new')
d = dict(zip(df['new'], df['Col2']))
df_2['Material'] = df_2['Material'].map(d)

df_2 = df_2.dropna(subset=['Material'])
print (df_2)
  Material Description
0     A200        N600
1     B300        N500
2     A201        N900
3     B602        N800

这是另一种方法:

基本上将“Col2”和 merge 与“Material”上的 df2 分开:

out = (df2
       .merge(df1[['Col2']]
              .assign(Material=df1['Col2']
                      .str.extract(r'(\D+)(\d+)')[1]
                      .astype(int)), on='Material')
       .drop(columns='Material')
       .rename(columns={'Col2':'Material'})[['Material', 'Description']])

输出:

  Material Description
0     A200        N600
1     B300        N500
2     A201        N900
3     B602        N800