Строчный поиск из другого фрейма данных - PullRequest
0 голосов
/ 02 июля 2018

У меня есть два кадра данных, которые я хотел бы объединить в зависимости от определенных условий. Это первый кадр данных, каждая строка представляет одно наблюдение (таким образом, идентификаторы встречаются несколько раз):

df1

  ID  Count  Publication
0  A     10         1990
1  B     15         1990
2  A     17         1990
3  B     19         1991
4  A     13         1991

Это второй кадр данных. Здесь каждый идентификатор отображается только один раз, но с течением времени (здесь с 1990 по 1993 год).

df2

  ID  1990  1991  1992  1993
0  A   1.1   1.2   1.3   1.4
1  B   2.3   2.4   2.4   2.6
2  C   3.4   3.5   3.6   3.7
3  D   4.5   4.6   4.7   4.8

Моя цель - добавить столбец результатов в df1, в котором я умножаю значение из столбца df1 ["Count"] на соответствующее значение (пара ID-год) из df2, например, первая строка: «ID» A в «1990» умножается на 1,1 на «Count» 10 = 11.

results

  ID  Count  Publication  Results
0  A     10         1990     11.0
1  B     15         1990     34.5
2  A     17         1990     18.7
3  B     19         1991     45.6
4  A     13         1991     15.6

До сих пор я пробовал несколько вариантов, используя функцию панд .apply(), но она не работала. Я также пытался .merge() столбцы от df2 до df1, основываясь на идентификаторах, но я все еще не могу выполнить вычисление впоследствии (я надеялся, что это облегчает проблему).

Вопрос: Есть ли простой и эффективный способ пройти через df1 строка за строкой и «выбрать» соответствующие значения из df2 для расчета?

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Я не знаю, насколько это эффективно, но вы можете сделать это:

df1 = df1.set_index(['ID', 'Publication'])
df2 = df2.set_index('ID').stack()
df2.index.rename(['ID', 'Publication'], inplace=True)
df1['df2_value'] = df2
df1['result'] = df1['Count'] * df1['df2_value']
0 голосов
/ 02 июля 2018

Использование lookup

df2.set_index('ID').lookup(df1.ID,df1.Publication.astype(str))
Out[189]: array([1.1, 2.3, 1.1, 2.4, 1.2])

df1['Results']=df2.set_index('ID').lookup(df1.ID,df1.Publication.astype(str))*(df1.Count)
df1
Out[194]: 
  ID  Count  Publication  Results
0  A     10         1990     11.0
1  B     15         1990     34.5
2  A     17         1990     18.7
3  B     19         1991     45.6
4  A     13         1991     15.6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...