Как я могу объединить эти два набора данных в «Имя» и «Год»? - PullRequest
0 голосов
/ 02 мая 2020

Я новичок в этой области и застрял на этой проблеме. У меня есть два набора данных

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

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Позвольте мне перейти к вашей проблеме, предположив, что вам нужно создать набор данных из 2 столбцов и 2 столбцов: 1. 'year' и 2. 'name' okay

1. мы сначала переименуем все неправильные имена Я надеюсь, что вы знаете все неправильные имена из all_batting_statistics_df , используя это

all_batting_statistics_df.replace(regex=r'^Glen.$', value='Glenn Davis')

, как только вы исправили все написанные слова, выберите меньшее с именами, которые вы знаете, так что это не займет много времени

2. нам нужно, чтобы оба набора данных имели одинаковые столбцы, т. е. только «год» и «имя» . Используйте это, чтобы отбросить ненужные нам столбцы

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 переименование фрейма данных

df_new_1 = all_batting_statistics_df(colums={'Year': 'year', 'Name':'name'})

4. затем, чтобы объединить их

мы будем использовать это

all_batsman_df.merge(df_new_1, left_on='year', right_on='name')

ЗАКЛЮЧИТЕЛЬНЫЕ МЫСЛИ: Если вы не хочу делать все это, найдите способ экспортировать набор данных в листы Google или в Microsoft Excel и использовать их для редактирования с этим передовым программным обеспечением, если вам нравится pandas, то это не так сложно, вы найдете способ, все лучший!

0 голосов
/ 02 мая 2020

Вы можете сделать

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

, чтобы заменить имена в df_b ближайшим совпадением из df_a, а затем выполнить слияние. Смотрите также этот пост .

...