根据另一个数据框编辑列值的内容
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
我有这些数据框:
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