pandas 合并到字符串第一部分的字符串

wkyowqbh  于 10个月前  发布在  其他
关注(0)|答案(3)|浏览(109)

我有两个篮子

df1 = pd.DataFrame({'id':['XYZ', 'ABC1', 'CDS'], 'col1':[1,2,3]})
df2 = pd.DataFrame({'id':['XYZ1', 'XYZ2', 'ABC1', 'ABC11', 'CDSS', 'CDS', 'ABC2', 'ABC', 'XYA'], 
                    'col2':[1,2,3,4,5,6,7,8,9]})

个字符

id   col2
0   XYZ1    1
1   XYZ2    2
2   ABC1    3
3   ABC11   4
4   CDSS    5
5   CDS     6
6   ABC2    7
7   ABC     8
8   XYA     9


我想把df1和df2合并在df1的完整id和df2的第一个匹配的字符上,这样我就得到了这个字符串

id col2  col1
0   XYZ1    1   1.0
1   XYZ2    2   1.0
2   ABC1    3   2.0
3   ABC11   4   2.0
4   CDSS    5   3.0
5   CDS     6   3.0
6   ABC2    7   NaN
7   ABC     8   NaN
8   XYA     9   NaN


我该怎么做?

b4lqfgs4

b4lqfgs41#

df1应用为pd.Series.map中使用的Map:

id_map = df1.set_index('id')['col1'].to_dict()
new_df = (df2.assign(col1=df2['id'].map(lambda x:
                                        next((v for k, v in id_map.items()
                                              if x.startswith(k)), None))))
print(new_df)

个字符

pes8fvy9

pes8fvy92#

df2中的id中提取密钥,从df1中的id开始,然后使用这些密钥执行merge操作

df2['key'] = df2['id'].str.extract(r'^(%s)' % '|'.join(df1['id']))
result = df2.merge(df1.rename(columns={'id': 'key'}), on='key', how='left')

个字符

50few1ms

50few1ms3#

您需要合并这两个列,但首先需要根据df2中的id是否是df1中id的子字符串为df2添加一个自定义列:

ids1 = df1.id.to_list()
def id_subset(id, ids1):
  for s in ids1:
    if s in id:
      return s
  return False
# add a new substring id column
df2['id2'] = df2['id'].apply(lambda x: id_subset(x, ids1) )

# merge and clean
df_out = df2.merge(df1, left_on = 'id2', right_on = 'id', how='left')
df_out.rename(columns={'id_x':'id'}).drop(columns=['id_y', 'id2'])

字符串
输出量:

id  col2  col1
0   XYZ1     1   1.0
1   XYZ2     2   1.0
2   ABC1     3   2.0
3  ABC11     4   2.0
4   CDSS     5   3.0
5    CDS     6   3.0
6   ABC2     7   NaN
7    ABC     8   NaN
8    XYA     9   NaN

相关问题