Python Pandas объединяет / объединяет DataFrames с использованием идентификаторов индекса или столбца

Я хотел бы использовать метод pandas.concat для объединения двух DataFrames, но я не полностью понимаю все аргументы pandas.concat. У меня есть два DataFrames, которые имеют одинаковые идентифицирующие переменные в столбцах, но отличаются в одном столбце.

import pandas as pd
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'mz':[500.0, 500.5, 501.0]}
df_a = pd.DataFrame(dict_data)
dict_data = {'Treatment': ['C', 'C', 'C'], 'Biorep': ['A', 'A', 'A'], 'Techrep': [1, 1, 1], 'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'], 'inte':[1100.0, 1050.0, 1010.0]}
df_b = pd.DataFrame(dict_data)

df_a

        AAseq   Biorep  Techrep Treatment   mz
0    ELVISLIVES  A   1   C   500.0
1    ELVISLIVES  A   1   C   500.5
2    ELVISLIVES  A   1   C   501.0

df_b

    AAseq   Biorep  Techrep Treatment   int
0    ELVISLIVES  A   1   C   1100
1    ELVISLIVES  A   1   C   1050
2    ELVISLIVES  A   1   C   1010

Я могу добавить столбец следующим образом:

df_m = df_a.copy()
df_m['inte'] = df_b['inte']

     AAseq  Biorep  Techrep Treatment   inte
0    ELVISLIVES  A   1   C   1100
1    ELVISLIVES  A   1   C   1050
2    ELVISLIVES  A   1   C   1010

Мои реальные данные выглядят намного сложнее, и я боюсь, что приведенный выше метод может привести к неправильному порядку значений в строках (особенно потому, что я хочу заранее использовать pandas.melt).

Когда используешь:

dfm = pd.concat([df_a, df_b])

     AAseq  Biorep  Techrep Treatment   inte    mz
0    ELVISLIVES  A   1   C   NaN     500.0
1    ELVISLIVES  A   1   C   NaN     500.5
2    ELVISLIVES  A   1   C   NaN     501.0
0    ELVISLIVES  A   1   C   1100    NaN
1    ELVISLIVES  A   1   C   1050    NaN
2    ELVISLIVES  A   1   C   1010    NaN

Объединенный DataFrame расширяет значения по строкам до NaN vals.

Вопрос: как достичь того же результата (показанного выше) с помощью concat?

Спасибо за поддержку!


person tryptofame    schedule 12.07.2014    source источник
comment
Вы действительно проверили, сломает ли этот метод ваш набор данных?   -  person Ffisegydd    schedule 12.07.2014
comment
Нет у меня нет. Набор данных большой (строки 3847440, столбцы 16), и я не знаю, как проверить разрыв. Как мне сделать тест на перерыв ?? Я прошу метод concat, так как надеюсь, что есть аргумент (ы), который будет полагаться на индексы двух фреймов данных для их объединения / слияния.   -  person tryptofame    schedule 12.07.2014
comment
Создайте меньший набор данных для тестов.   -  person furas    schedule 12.07.2014
comment
честно :) Я просто хотел бы быть уверен, что конкатенация не нарушит фрейм данных. Если вы знаете, как добиться того же результата с помощью метода concat, пожалуйста, будьте добры и просветите меня.   -  person tryptofame    schedule 12.07.2014


Ответы (1)


С использованием

 print pd.concat((df_a, df_b['inte']), axis=1)

ты можешь получить

        AAseq Biorep  Techrep Treatment     mz  inte
0  ELVISLIVES      A        1         C  500.0  1100
1  ELVISLIVES      A        1         C  500.5  1050
2  ELVISLIVES      A        1         C  501.0  1010

Вы этого ожидали?


Или, может быть, у вас есть более сложные данные - см. Другие значения в столбце Treatment.

        AAseq Biorep  Techrep Treatment     mz
0  ELVISLIVES      A        1         A  500.0
1  ELVISLIVES      A        1         B  500.5
2  ELVISLIVES      A        1         C  501.0

        AAseq Biorep  Techrep Treatment  inte
0  ELVISLIVES      A        1         C  1100
1  ELVISLIVES      A        1         B  1050
2  ELVISLIVES      A        1         A  1010

и вам нужно поддерживать порядок, используя значения из столбцов AAseq Biorep Techrep Treatment, затем используйте merge

import pandas as pd
dict_data = {
    'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'],
    'Biorep': ['A', 'A', 'A'],
    'Techrep': [1, 1, 1],
    'Treatment': ['A', 'B', 'C'],
    'mz':[500.0, 500.5, 501.0]
}
df_a = pd.DataFrame(dict_data)

dict_data = {
    'AAseq': ['ELVISLIVES', 'ELVISLIVES', 'ELVISLIVES'],
    'Biorep': ['A', 'A', 'A'],
    'Techrep': [1, 1, 1],
    'Treatment': ['C', 'B', 'A'],
    'inte':[1100.0, 1050.0, 1010.0]
}
df_b = pd.DataFrame(dict_data)

print pd.merge(left=df_a, right=df_b, on=['AAseq', 'Biorep', 'Techrep', 'Treatment'])

результат:

        AAseq Biorep  Techrep Treatment     mz  inte
0  ELVISLIVES      A        1         A  500.0  1010
1  ELVISLIVES      A        1         B  500.5  1050
2  ELVISLIVES      A        1         C  501.0  1100
person furas    schedule 12.07.2014
comment
Да, это то, что я ожидал, однако при попытке вашего кода я получаю сообщение об ошибке: TypeError: Невозможно объединить список ['DataFrame', 'Series']. Я пробовал ваш точный код, а также pd.concat ( [df_a, df_b ['inte']], ось = 1). Я могу выполнить оператор, только если удалю индекс столбца: pd.concat ((df_a, df_b), axis = 1), но это приведет к дублированию столбцов идентификатора. - person tryptofame; 12.07.2014
comment
Я пробовал данные вашего примера, и он работает - я использую pandas 0.14.0 (print pd.__version__). Проверьте свою версию. - person furas; 12.07.2014
comment
БОЛЬШОЕ СПАСИБО!! Функция «слияния» - это ТОЧНО то, что я искал / отсутствовал. Потрясающие. Ваша помощь очень ценится! - person tryptofame; 12.07.2014
comment
В конце концов вы можете попробовать обновить pandas до более новой версии (pip install -upgrade pandas), если вам все еще нужно concat();) - person furas; 12.07.2014