对于合并 Id 和 Flower 列的前 4 个字符的 substr,请尝试以下操作:
import pandas as pd
df1 = pd.DataFrame({'Flower': ["Jasmine", "Lotus", "BudRose", "Lily"],
'Id': ["1023", "3405", "4409", "2457"],
'City': ["Hawai", "St Jose", "Miami", "Washington"]})
df2 = pd.DataFrame({'Flower': ["Jasmine", "Lily", "Lily"],
'Id': ["1023LD", "2457MH", "3346HK", ],
'City': ["Hawai", "Washington", "Washington"]})
def get_substr(x):
return x['Id'].str[:4]
merged_df = df1.assign(merge_with_x=get_substr) \
.merge(df2.assign(merge_with_x=get_substr),
on=['Flower', 'City', 'merge_with_x'],
suffixes=['_x', '/z']) \
.filter(regex=r'Flower|City|.*/z')
# Fix Column Names
merged_df.columns = merged_df.columns.str.rstrip('/z')
# Fix Column Order
merged_df = merged_df[['Flower', 'Id', 'City']]
print(merged_df)
输出:
花城
0 茉莉花 1023LD 夏威夷
1 百合 2457MH 华盛顿
工作原理
将列添加到 DF 以及所需的子字符串:
def get_substr(x):
return x['Id'].str[:4]
print(df1.assign(merge_with_x=get_substr))
print(df2.assign(merge_with_x=get_substr))
花 ID 城市 merge_with_x
0 茉莉花 1023 夏威夷 1023
1 莲花 3405 圣何塞 3405
2 BudRose 4409 迈阿密 4409
3 莉莉 2457 华盛顿 2457
花 ID 城市 merge_with_x
0 茉莉花 1023LD 夏威夷 1023
1 百合 2457MH 华盛顿 2457
2 百合 3346HK 华盛顿 3346
在 Flower 和 substr 上合并:
print(df1.assign(merge_with_x=get_substr)
.merge(df2.assign(merge_with_x=get_substr),
on=['Flower', 'City', 'merge_with_x'],
suffixes=['_x', '/z']))
花 Id_x 城市 merge_with_x Id/z
0 茉莉花 1023 夏威夷 1023 1023LD
1 莉莉 2457 华盛顿 2457 2457MH
然后过滤掉合并创建的列:
print(df1.assign(merge_with_x=get_substr)
.merge(df2.assign(merge_with_x=get_substr),
on=['Flower', 'City', 'merge_with_x'],
suffixes=['_x', '/z'])
.filter(regex=r'Flower|City|.*/z'))
花城id/z
0茉莉花夏威夷1023LD
1 莉莉华盛顿 2457MH
最后清理列名和顺序:
merged_df.columns = merged_df.columns.str.rstrip('/z')
merged_df = merged_df[['Flower', 'Id', 'City']]