Заполнить столбец в кадре данных на основе значений iat - PullRequest
0 голосов
/ 27 ноября 2018
lookup={'Tier':[1,2,3,4],'Terr.1':[0.88,0.83,1.04,1.33],'Terr.2':[0.78,0.82,0.91,1.15],'Terr.3':[0.92,0.98,1.09,1.33],'Terr.4':[1.39,1.49,1.66,1.96],'Terr.5':[1.17,1.24,1.39,1.68]}
df={'Tier':[1,1,2,2,3,2,4,4,4,1],'Territory':[1,3,4,5,4,4,2,1,1,2]}
df=pd.DataFrame(df)
lookup=pd.DataFrame(lookup)

lookup содержит значения поиска, а df содержит данные, передаваемые в iat.

При печати я получаю правильные значения (lookup.iat [tier, terr]).Однако, когда я пытаюсь установить эти значения в новом столбце, он запускается бесконечно, или в этом простом тестовом примере просто копирует 1 значение 10 раз.

for i in df["Tier"]:
    tier=i-1
    for j in df["Territory"]:
        terr=j
        #print(lookup.iat[tier,terr])
        df["Rate"]=lookup.iat[tier,terr]

Есть мысли о возможном лучшем решении?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

После того, как lookup был изменен немного таким же образом, как @ rahlf23 плюс с помощью stack, вы можете merge оба кадра данных, такие как:

df['Rate'] = df.merge( lookup.rename(columns={ i: int(i.split('.')[-1]) 
                                               for i in lookup.columns if 'Terr' in i})
                            .set_index('Tier').stack()
                            .reset_index().rename(columns={'level_1':'Territory'}),
                       how='left')[0]

Если у вас естьбольшой кадр данных df, тогда он должен быть быстрее, чем apply и loc

Кроме того, если какая-либо пара (Tier, Territory) в df не существует в lookup, этот метод выигралне выдает ошибку

0 голосов
/ 27 ноября 2018

Вы можете использовать apply() после некоторой модификации вашего lookup кадра данных:

lookup = lookup.rename(columns={i: i.split('.')[-1] for i in lookup.columns}).set_index('Tier')
lookup.columns = lookup.columns.astype(int)

df['Rate'] = df.apply(lambda x: lookup.loc[x['Tier'],x['Territory']], axis=1)

Возвращает:

   Tier  Territory  Rate
0     1          1  0.88
1     1          3  0.92
2     2          4  1.49
3     2          5  1.24
4     3          4  1.66
5     2          4  1.49
6     4          2  1.15
7     4          1  1.33
8     4          1  1.33
9     1          2  0.78
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...