Ошибка слияния asof: MergeError: ключ должен быть целым, отметкой времени или с плавающей запятой - PullRequest
3 голосов
/ 11 июля 2019

Мне нужно объединить две точки, когда они находятся в пределах +2,75 и -2,75 друг от друга.Эти две точки находятся в двух отдельных фреймах данных (оба обрабатываются на более ранних этапах конвейера).

Я думаю, что merge_asof может помочь мне в этом случае с допуском 2,75 и направлением «ближайший».

Однако я получаю сообщение об ошибке:

MergeError: ключ должен быть целым числом, отметкой времени или с плавающей запятой

Это один из двух кадров данных:

    Unnamed: 0  Section_id  Section_location    
36015   36015   055_305AR_10.8  397.0   
7344    7344    055_305AR_10.8  659.0   

Теперь у меня есть второй фрейм данных, также с Section_id и section_locations вроде 402.5.Поэтому я хочу объединить, если (в этом примере) section_location второго фрейма данных больше или равен 394,25 и меньше или равен 399,75.

Я также отсортировал значения обоих фреймов данных с помощью section_id и section_location.

Я попробовал следующий код, который выдает ошибку.

 def mergeasof_dfs(df1, df2):

    return pd.merge_asof(left = df1, right = df2, 
                         on='Section_id', 
                         by='Section_location',
                         tolerance = 2.75,
                         direction = 'nearest'
                        )

---------------------------------------------------------------------------
MergeError                                Traceback (most recent call last)
<ipython-input-66-641a0dfae9af> in <module>
----> 1 test = mergeasof_dfs(df1, df2)

<ipython-input-65-bc88146fa086> in mergeasof_dfs(df1, df2)
      5                          by='Section_location',
      6                          tolerance = 2.75,
----> 7                          direction = 'nearest'
      8                         )

Ошибка:

MergeError: ключ долженбыть целым числом, отметкой времени или числом с плавающей запятой

1 Ответ

0 голосов
/ 11 июля 2019

Одним из возможных решений является создание вспомогательных целочисленных столбцов для слияния - сначала создается DataFrame с помощью concat с параметром keys и новым столбцом с помощью factorize для целых чисел :

df1 = pd.DataFrame({
        'Section_location':list('abcymdc'),

})
df2 = pd.DataFrame({
        'Section_location':list('abhucda'),

})


df3 = pd.concat([df1[['Section_location']],df2[['Section_location']]], keys=('df1','df2'))
df3['Section_id_new'] = pd.factorize(df3['Section_location'])[0]
print (df3)
      Section_location  Section_id_new
df1 0                a               0
    1                b               1
    2                c               2
    3                y               3
    4                m               4
    5                d               5
    6                c               2
df2 0                a               0
    1                b               1
    2                h               6
    3                u               7
    4                c               2
    5                d               5
    6                a               0

df1['Section_id_new'] = df3.loc['df1', 'Section_id_new']
print (df1)
df2['Section_id_new'] = df3.loc['df2', 'Section_id_new']
print (df2)
  Section_location  Section_id_new
0                a               0
1                b               1
2                c               2
3                y               3
4                m               4
5                d               5
6                c               2
  Section_location  Section_id_new
0                a               0
1                b               1
2                h               6
3                u               7
4                c               2
5                d               5
6                a               0

Итак, ваше решение

 def mergeasof_dfs(df1, df2):

    df3 = pd.concat([df1[['Section_location']],df2[['Section_location']]], keys=('df1','df2'))
    df3['Section_id_new'] = pd.factorize(df3['Section_location'])[0]
    df1['Section_id_new'] = df3.loc['df1', 'Section_id_new']
    df2['Section_id_new'] = df3.loc['df2', 'Section_id_new']

    df = pd.merge_asof(left = df1, right = df2, 
                         on='Section_id_new', 
                         by='Section_location',
                         tolerance = 2.75,
                         direction = 'nearest'
                        )
    return df.drop('Section_id_new', axis=1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...