如何合并“名称”和“年份”上的这两个数据集?

2024-06-06 23:21:43 发布

您现在位置:Python中文网/ 问答频道 /正文

我是这个领域的新手,一直在这个问题上。我有两个数据集

  1. 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
  1. 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')

Tags: 数据namein名称dfnlmergeall
2条回答

你能行

import difflib
df_b['name'] = df_b['name'].apply(lambda x: \
    difflib.get_close_matches(x, df_a['name'])[0])

要将df_b中的名称替换为df_a中最接近的匹配项,请执行合并。另见this post

让我假设您必须创建一个包含2列的数据集,并且2列为1,从而解决您的问题。”第二年和第二年名字' 好的

1。我们将首先重命名所有错误的名称 我希望你知道所有来自all_batting_statistics_dfusing 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,那么这并不是很难,你会找到一种方法,最好的

相关问题 更多 >