我需要在相似但不相同的列上连接数据框。幸运的是,列之间的小写字母是相同的。所以我试图从每列中隔离小写字母,创建要加入的新列。
df1 = pd.DataFrame({'alpha': ['1', '2', '3'],
'beta': ['JRLeparoux', 'BJHernandez,Jr.','SXBridgmohan'],})
df2 = pd.DataFrame({'alpha': ['1', '2', '3'],
'gamma': ['Leparoux R', 'Hernandez,B, Jr.','Bridgmohan S X'],
'zeta': ['17', '23','116'],})
这就是我试过的
def joinnames(df):
filelist = []
for c in df:
if c.islower():
filelist.append(c)
return filelist
df1['joinhere'] = df1['beta'].apply(joinnames)
df2['joinhere'] = df2['gamma'].apply(joinnames)
pd.merge(df1,df2, how ='left', left_on = 'joinhere', right_on = 'joinhere' )
这是我想要实现的输出。
final = pd.DataFrame({'alpha': ['1', '2', '3'],
'gamma': ['Leparoux R', 'Hernandez,B, Jr.','Bridgmohan S X'],
'beta': ['JRLeparoux', 'BJHernandez,Jr.','SXBridgmohan'],
'zeta': ['17', '23','116'],})
答案 0 :(得分:1)
您可以使用Series.str.extract
查找小写字母:
import pandas as pd
df1 = pd.DataFrame({'alpha': ['1', '2', '3'],
'beta': ['JRLeparoux', 'BJHernandez,Jr.','SXBridgmohan'],})
df2 = pd.DataFrame({'alpha': ['1', '2', '3'],
'gamma': ['Leparoux R', 'Hernandez,B, Jr.','Bridgmohan S X'],
'zeta': ['17', '23','116'],})
df1['lower'] = df1['beta'].str.extract(r'([a-z]+)')
df2['lower'] = df2['gamma'].str.extract(r'([a-z]+)')
final = pd.merge(df1, df2)
print(final)
产量
alpha beta lower gamma zeta
0 1 JRLeparoux eparoux Leparoux R 17
1 2 BJHernandez,Jr. ernandez Hernandez,B, Jr. 23
2 3 SXBridgmohan ridgmohan Bridgmohan S X 116
请注意,这假设从a
到z
收集所有ASCII字符,以生成要加入的值。
如果您的beta
和gamma
列包含非ASCII小写字符(例如带有重音符号的字符),则可能需要将这些字符添加到正则表达式字符类[a-z]
中。