Панды принудительно объединяются один в один в столбце, содержащем повторяющиеся ключи - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть два Dataframes, df1:

| ID        | Invoice   |
-------------------------
| X\191     | 4         |
| R\192     | 4         |
| 733       | 1         |
| X215      | 3         |
| BL000002  | 3         |

df2:

| ID        | Invoice   |
-------------------------
| X191      | 4         |
| X215      | 3         |
| BL000002  | 3         |

И я должен объединить их один в один, чтобы получить:

| ID        | Invoice   | ID        |
-------------------------------------
| X\191     | 4         | X191      |
| X\192     | 4         |           |
| 733       | 1         |           |
| X215      | 3         | X215      |
| BL000002  | 3         | BL000002  |

Но когда я выполняю внешнее слияние, я получаю повторяющиеся значения

import pandas as pd
dict1 = {"ID": ["X\\191","R\\192","733","X215","BL000002"], "Inv": [4,4,1,3,3]}
df1 = pd.DataFrame.from_dict(dict1)

dict2 = {"ID": ["X191","X215","BL000002"], "Inv": [4,3,3]}
df2 = pd.DataFrame.from_dict(dict2)

some_df = pd.merge(df1, df2, on = 'Inv', how='outer')

Вывод выглядит следующим образом:

    ID_x    Inv    ID_y
X\191       4      X191
X\192       4      X191
733         1       NaN
X215        3      X215
X215        3  BL000002
BL000002    3      X215
BL000002    3  BL000002

Как можно объединить так, чтобы я получил его для соединения один к одномуи не смешивать и сочетать.

Я не могу использовать никакие другие столбцы в слиянии, поскольку они будут различаться в реальных данных.

Редактировать и объяснять Извините.Я не был достаточно ясен.Идентификатор столбца не соответствует.Я не могу обещать, будет ли это всегда подстрока.Но значения счета должны быть одинаковыми.Это было введено человеком более года и около 15 тысяч строк.Мне нужно упорядочить их так, чтобы они с одинаковыми значениями счетов-фактур располагались рядом друг с другом, чтобы легче было вручную проверять, когда чего-то не хватает в одном из кадров данных (изначально лист Excel)

Ответы [ 3 ]

0 голосов
/ 24 декабря 2018

Попробуйте ниже:

Вы ищете pandas.merge_asof.Это позволяет вам комбинировать 2 DataFrames на ключе, в этом случае времени, без требования их точного соответствия.Вы можете выбрать направление для определения приоритета матча, но в этом случае очевидно, что вы хотите, чтобы ближайший

>>> pd.merge_asof(df2.sort_values('Inv'), df1.sort_values('Inv'), on='Inv', direction='nearest')
  ID_x  Inv  ID_y 
0  215    3  X319
1  319    3  X319
2  191    4  X192

посмотрел на здесь , заимствовано у @ ALollz

0 голосов
/ 24 декабря 2018

Вам необходим дополнительный столбец на основе cumcount:

u = df1.assign(Cnt=df1.groupby('Inv').cumcount())
v = df2.assign(Cnt=df2.groupby('Inv').cumcount())
u.merge(v, on=['Inv', 'Cnt'], how='left').drop('Cnt', 1)

       ID_x  Inv      ID_y
0     X\191    4      X191
1     R\192    4       NaN
2       733    1       NaN
3      X215    3      X215
4  BL000002    3  BL000002
0 голосов
/ 24 декабря 2018

Я думаю, что простой поиск по списку поможет:

df1['new_id'] = df1.apply(lambda row: row['ID'] if row['ID'] in df2['ID'].tolist() else "", axis=1)

     ID  Invoice new_id
0  X191        4   X191
1  X192        4       
2  X212        1       
3  X215        3   X215
4  X319        3   X319

После того, как вы найдете то, что вы можете удалить (я предполагаю, что ID имеет \, ., '@'):

df['ID'] = df['ID'].str.replace(r'\\|\.|@', '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...