Соединение двух df с условием в python - PullRequest
0 голосов
/ 29 апреля 2018

У меня есть два ДФ. df1 имеет более 2 миллионов строк и содержит полные данные. Я хотел бы объединить данные из df2, который имеет более 70 000 строк, но его структура немного сложна. df1 имеет для каждой строки строки KO-STA и KO-PAR. df2 имеет в некоторых случаях данные только на KO-STA, в некоторых случаях только на KO-PAR и в некоторых случаях на обоих. Я хотел бы объединить эти два df и получить данные о Need1 и Need2.

df1

          STA_SID   DST_SID        CC   KO_SIFKO    KO-STA       KO-PAR
135  10021582  28878502            NaN       634    634-83        537-780/9   
117  10028732  29999540            NaN       657  657-1729        537-780/4
117  10028732  29999541            NaN       657  657-1729        537-780/4
117  10028732  29999542            NaN       657  657-1729        537-780/4
117  10028732  29999543            NaN       657  657-1729        537-780/4
117  10028732  31356572            NaN       657  657-1729        537-780/4

df2

        KO-STA  STA-PAR       KO-PAR          Need1       Need2  \
0   1976-_    366/2   1976-366/2                Bio       49.500000   
1    991-_  329/128  991-329/128                 PH      184.399994   
2  2147---    96/19   2147-96/19                Win        8.850000   
3   2048-_    625/4   2048-625/4                SSE        4.940000   
4   2194-_    285/3   2194-285/3               TI f      163.000000   
5  2386---     97/1    2386-97/1                Bio       49.500000   
6   2002-_   2002/9  2002-2002/9                Win       12.850000   
7   1324-_       62      1324-62                Win        8.850000   
8   1625-_    980/1   1625-980/1                Win        8.850000   
9   1625-_    980/1   1625-980/1                Bio       49.500000 

Моя попытка была со следующим кодом

GURS_ES1 = pd.merge(df1.reset_index(), df2.reset_index(), on = 'KO-STA')
GURS_ES2 = pd.merge(GURS_ES1.reset_index(), df2.reset_index(), on = 'KO-PAR')

Но после первого слияния GURS_ES1 имеет два индекса KO-PAR_x и KO-PAR_y и не объединяет их в один столбец. Любые рекомендации?

1 Ответ

0 голосов
/ 29 апреля 2018

Я приведу вам пример, чтобы убедиться, как вы можете действовать, и какова причина наблюдаемого вами поведения:

Во-первых, давайте построим наши образцы данных

df1 = pd.DataFrame(np.random.randint(1,3,size=(3,3)),columns=['a1','x1','x2'])

Выход

   a1   x1  x2
0   1   2   1
1   2   1   1
2   1   2   2

Теперь другой фрейм данных

df2 = pd.DataFrame(np.random.randint(1,3,size=(3,3)),columns=['a2','x1','x2'])

    a2  x1  x2
0   2   2   1
1   1   2   2
2   1   1   2

Теперь, если мы объединяем только (!) Один из индексов, которые встречаются в обоих фреймах данных, то pandas хочет, чтобы вы могли восстановить, из какого фрейма данных первоначально пришел индекс

pd.merge(df1,df2, on='x1')

выход

   a1  x1 x2_x a2 x2_y
0   1   2   1   2   1
1   1   2   1   1   2
2   1   2   2   2   1
3   1   2   2   1   2
4   2   1   1   1   2

Теперь самый простой способ избавиться от этого - удалить один из двойных столбцов в одном из фреймов данных:

pd.merge(df1[df1.columns.drop('x2')], df2, on='x1')

выход

    a1  x1  a2  x2
0   1   2   2   1
1   1   2   1   2
2   1   2   2   1
3   1   2   1   2
4   2   1   1   2

Но вы также можете объединить список столбцов. Обратите внимание, что здесь мы выполняем внутреннее соединение, которое может значительно уменьшить количество строк в выходном фрейме данных (или даже привести к пустым фреймам данных, если в обоих столбцах нет совпадений)

pd.merge(df1,df2, on=['x1','x2'])

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