Приблизительное соединение с пандами - PullRequest
0 голосов
/ 05 июля 2018

У меня есть 2 кадра данных, df1 и df2. Оба моих фрейма данных имеют столбец с именем 'zip_code', и я хотел бы объединить df1 и df2 в этих столбцах.

Дело в том, что в df2 иногда в строках столбца 'zip_code' отсутствует один '0' в начале. Но я бы хотел, чтобы панды обнаружили, что они имеют «одинаковую» ценность.

Есть ли способ сделать это без предварительной обработки моих данных раньше?

Ответы [ 4 ]

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

В этом случае Series.str.zfill() полезно для предварительной обработки.

import pandas as pd
df = pd.DataFrame({'zip5': ['1', '12', '123', '1234', '12345', '123456']})

df.zip5.str.zfill(5)
#0     00001
#1     00012
#2     00123
#3     01234
#4     12345
#5    123456
#Name: zip5, dtype: object

Это не повлияет на почтовые индексы, которые длиннее или равны 5 символам, и заполнят все начальными нулями, в данном случае до 5 символов. Вы можете использовать это для обновления почтовых индексов в вашем df2, а затем слияния как обычно.

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

Просто используйте функцию соединения DataFrame

import pandas as pd

A = pd.DataFrame(
    {
        'zip_code':[1000,1001,2000,2002],
        'place':['A','A','B','B']
    }
)

B = pd.DataFrame(
    {
        'Name':['x','y','z'],
        'zip_code':[1001,1000,2000]

})
B['zip_code'] = [x.lstrip('0') for x in B['zip_code']]
B.join(A.set_index('zip_code'), on='zip_code')
0 голосов
/ 05 июля 2018

Это будет долго и при условии, что все почтовые индексы будут иметь одинаковую длину после добавления 0 в начале.

import pandas as pd
import numpy as np

t1 = pd.DataFrame({'id':[1,2,3,4],
                 'zip_code':['0234','0345','3456','4567']})

t2 = pd.DataFrame({'id2':[5,6,7,8],
                 'zip_code':['234','0345','3456','4567']})

t2['lens'] = t2.zip_code.apply(len)

t2.loc[:,'zip_code'] = np.where(t2.lens<4,'0'+t2['zip_code'].astype(str),t2['zip_code'])

вход t1:

    id  zip_code
0   1   0234
1   2   0345
2   3   3456
3   4   4567

Вход t2:

    id2 zip_code
0   5   234
1   6   0345
2   7   3456
3   8   4567

Выход t2:

    id2 zip_code    lens
0   5   0234    3
1   6   0345    4
2   7   3456    4
3   8   4567    4

Вы можете удалить столбец объектива, если он вам больше не понадобится. Теперь вы можете объединить два кадра данных t1 и t2, используя zip_code.

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

Я думаю, что предварительная обработка рекомендуется, если не требуется. В противном случае при слиянии у вас будут строки с двумя почтовыми индексами, один из которых начинается с «0», а другой - нет.

Вы можете обновить нарушающие почтовые индексы в df2 в соответствии с маской. Я предполагаю, что обе серии zip_code отлиты как str.

# prefixing with 0 causes a zip_code match with df1
mask = ('0' + df2['zip_code']).isin(df1['zip_code'].unique())

# apply the prefix for these cases
df2.loc[mask, 'zip_code'] = '0' + df2.loc[mask, 'zip_code']

Затем выполните слияние, как обычно.

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