Заполнение нового столбца в кадре данных из существующих двух с различной длиной

1

Как я могу добавить новый столбец к существующему фреймворку данных, сравнив его с другим, который короче по длине и имеет другой индекс.

Например, если у меня есть:

df1 =   country   code  year
      0 Armenia    a    2016
      1 Brazil     b    2017
      2 Turkey     c    2016
      3 Armenia    d    2017

df2 =  geoCountry   2016_gdp  2017_gdp
     0 Armenia        10.499    10.74
     1 Brazil         1,798.62  2,140.94
     2 Turkey         857.429   793.698

и я хочу в итоге:

df1 =  country   code  year  gdp
     0 Armenia    a    2016  10.499
     1 Brazil     b    2017  2,140.94
     2 Turkey     c    2016  857.429    
     3 Armenia    d    2017  10.74

Как я могу это сделать? Я попытался использовать ответы, изложенные здесь и здесь, но безрезультатно. Я также сделал следующее, которое занимает слишком много времени для блока данных 90000 строк

for index, row in df1.iterrows():
if row['country'] in list(df2.geoCountry):
    if row['year'] == 2016:
        df1['gdp'].append(df2[df2.geoCountry == str(row['country'])]['2016'])
    else:
        df1['gdp'].append(df2[df2.geoCountry == str(row['country'])]['2017'])
  • 0
    Дайте мне знать, был ли мой ответ полезным
Теги:
pandas

2 ответа

0
Лучший ответ

Я думаю, это то, что вы ищете:

df2 = df2.melt(id_vars = 'geoCountry', value_vars = ['2016_gdp', '2017_gdp'], var_name = ['year'])
df1['year'] = df1['year'].astype('int')
df2['year'] = df2['year'].str.slice(0,4).astype('int')
df1.merge(df2, left_on = ['country','year'], right_on = ['geoCountry','year'])[['country', 'code', 'year', 'value']]

Выход:

   country code  year     value
0  Armenia    a  2016    10.499
1   Brazil    b  2017  2,140.94
2   Turkey    c  2016   857.429
3  Armenia    d  2017     10.74
0

Вам в основном нужна функция расплава:

df2.columns = df2.columns.str.split("_").str.get(0)
df2 = df2.rename(index=str, columns={"geoCountry": "country"})
df3 = pd.melt(df2, id_vars=['geoCountry'], value_vars=['2016','2017'],
    var_name='year', value_name='gdp')

После этого вы просто объединяете df1 с указанным выше df3

result = pd.merge(df1, df3, on=['country','year'])

Выход:

pd.merge(df1, df3, on=['country','year'])
Out[36]: 
   country code  year       gdp
0  Armenia    a  2016    10.499
1   Brazil    b  2017  2140.940
2   Turkey    c  2016   857.429
3  Armenia    d  2017    10.740

Ещё вопросы

Сообщество Overcoder
Наверх
Меню