我是这个领域的新手,一直在这个问题上。我有两个数据集
all_batsman_df
,此df有5列('years','team','pos','name','salary')
years team pos name salary
0 1991 SF 1B Will Clark 3750000.0
1 1991 NYY 1B Don Mattingly 3420000.0
2 1991 BAL 1B Glenn Davis 3275000.0
3 1991 MIL DH Paul Molitor 3233333.0
4 1991 TOR 3B Kelly Gruber 3033333.0
all_batting_statistics_df
,此df有31列 Year Rk Name Age Tm Lg G PA AB R ... SLG OPS OPS+ TB GDP HBP SH SF IBB Pos Summary
0 1988 1 Glen Davis 22 SDP NL 37 89 83 6 ... 0.289 0.514 48.0 24 1 1 0 1 1 987
1 1988 2 Jim Acker 29 ATL NL 21 6 5 0 ... 0.400 0.900 158.0 2 0 0 0 0 0 1
2 1988 3 Jim Adduci* 28 MIL AL 44 97 94 8 ... 0.383 0.641 77.0 36 1 0 0 3 0 7D/93
3 1988 4 Juan Agosto* 30 HOU NL 75 6 5 0 ... 0.000 0.000 -100.0 0 0 0 1 0 0 1
4 1988 5 Luis Aguayo 29 TOT MLB 99 260 237 21 ... 0.354 0.663 88.0 84 6 1 1 1 3 564
我想在'year', 'name'
上合并这两个数据集。但问题是,这两个数据帧有不同的名称,就像在第一个数据集中一样,它有名称'Glenn Davis'
,但在第二个数据集中它有'Glen Davis'
现在,我想知道如何使用difflib
库合并它们,即使它有不同的名称?
任何帮助都将不胜感激。。。
提前谢谢
我使用了这个代码,我在这个平台上被问到一个问题,但它对我不起作用。在匹配两个数据集中的名称后,我将添加一个新列。我知道这不是一个好办法。如果我能做得更好,请提出建议
df_a = all_batting_statistics_df
df_b = all_batters
df_a = df_a.astype(str)
df_b = df_b.astype(str)
df_a['merge_year'] = df_a['Year'] # we will use these as the merge keys
df_a['merge_name'] = df_a['Name']
for comp_a, addr_a in df_a[['Year','Name']].values:
for ixb, (comp_b, addr_b) in enumerate(df_b[['years','name']].values):
if cdifflib.CSequenceMatcher(None,comp_a,comp_b).ratio() > .6:
df_b.loc[ixb,'merge_year'] = comp_a # creates a merge key in df_b
if cdifflib.CSequenceMatcher(None,addr_a, addr_b).ratio() > .6:
df_b.loc[ixb,'merge_name'] = addr_a # creates a merge key in df_b
merged_df = pd.merge(df_a,df_b,on=['merge_name','merge_years'],how='inner')
你能行
要将
df_b
中的名称替换为df_a
中最接近的匹配项,请执行合并。另见this post让我假设您必须创建一个包含2列的数据集,并且2列为1,从而解决您的问题。”第二年和第二年名字' 好的
1。我们将首先重命名所有错误的名称 我希望你知道所有来自
all_batting_statistics_df
using this的错误名字all_batting_statistics_df.replace(regex=r'^Glen.$', value='Glenn Davis')
一旦你纠正了所有的拼写,选择一个较小的有你知道的名字,所以它不会花很长时间
2。我们需要两个数据集具有相同的列,即仅“年”和“名称”use this to drop the columns we don't need
all_batsman_df_1 = all_batsman_df.drop(['team','pos','salary'])
all_batting_statistics_df_1 = all_batting_statistics_df.drop(['Rk','Name','Age','Tm','Lg','G','PA','AB','R','Summary'], axis=1)
我看不到所有的31列,所以我留下了它们,您必须添加到上面的代码中
3。我们需要使用python dataframe rename将列名更改为相同的名称,即“年”和“名称”
df_new_1 = all_batting_statistics_df(colums={'Year': 'year', 'Name':'name'})
4。接下来,要合并它们
we will use this
all_batsman_df.merge(df_new_1, left_on='year', right_on='name')
最后的想法: 如果你不想做这一切,找到一种方法将数据集导出到google sheets或microsoft excel,并使用这些高级软件对其进行编辑,如果你喜欢
pandas
,那么这并不是很难,你会找到一种方法,最好的相关问题 更多 >
编程相关推荐