Условный расчет на фреймах данных разного размера в Python - PullRequest
3 голосов
/ 03 августа 2020

Я работаю с двумя фреймами данных df1, df2 в формате Широта / Долгота / Значение.

    print(df1)
    0    1    2
0  -85 -175  1.8
1  -80 -170  1.6
..   

    print(df2)
    0    1    2
0 -70 -150  2.5
1 -80 -170  2.0
2 -85 -175  3.0
..

Я бы хотел умножить df1[2] by df2[2] if df1[0] = df2[0] and df1[1] = [1]. Я пробовал использовать следующее:

df1['multiplied']=np.where((df1[0]==df2[0],df1[2]*df2[2],np.nan) #if column 1 of df1 equals column 1 
                                                                     #of df2, multiply. Else give NaN

Мне известно, что я пренебрегаю вторым условием в этом примере. Обратной стороной является то, что сравнение значений столбцов осуществляется поэлементно (мои данные широты и долготы не сортируются). Также другой размер df вызывает ошибку «Можно сравнивать только объекты Series с одинаковой меткой» .

В другом подходе я попытался проверить, совпадают ли df1[0] и df2[0], и дать вывести новый df, соответствующий критериям:

dfnew=df1.loc[df1[0]==df2[0]]

Это привело меня к той же ошибке, что и выше.

Интересно, есть ли у вас какие-либо советы о том, как применять условные вычисления к несортированным фреймам данных разного размера?

Ответы [ 2 ]

1 голос
/ 03 августа 2020

Если вы хотите, чтобы ваш фрейм данных включал только совпадающие строки:

merged = df1.merge(df2,on=[0,1])
merged[2] = merged['2_x'] * merged['2_y']
merged = merged.drop(['2_x', '2_y'], axis=1)

вывод:

    0    1    2
0 -85 -175  5.4
1 -80 -170  3.2

И если вы хотите, чтобы он включал все строки из df2 (очевидно , вы можете изменить его, чтобы включить все строки из df1 или обоих) и установить для несовпадающих NaN:

merged = df1.merge(df2,on=[0,1],how='right')
merged[2] = merged['2_x'] * merged['2_y']
merged = merged.drop(['2_x', '2_y'], axis=1)

output:

    0    1    2
0 -70 -150  NaN
1 -80 -170  3.2
2 -85 -175  5.4
1 голос
/ 03 августа 2020
  1. Объедините фреймы данных на одинаковых long / lats. Обратите внимание, "inner" сохраняет только пересечение ключей:

    df3 = df1.merge(df2, on = [0,1], how = 'inner')

  2. Умножьте long / lats на себя:

    df3['multiplied_long'] = df3.0**2

    df3['multiplied_lat'] = df3.1**2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...