Панды собирают данные из двух фреймов данных - PullRequest
0 голосов
/ 25 июня 2018

У меня есть два фрейма данных панд, с некоторыми общими индексами и именами столбцов (например, частично перекрывающиеся временные ряды, связанные с общими величинами).

Мне нужно объединить эти два фрейма данных в один, содержащий все индексы и все значения для каждого индекса, сохраняя значения левого (правого) единицы в случае, если комбинация индекс-столбец появляется в обоих данныхframes.

Оба метода слияния и соединения бесполезны, поскольку метод слияния будет дублировать информацию, которая мне не нужна, и объединение вызывает одну и ту же проблему.

Какой эффективный метод получения нужного мне результата?

РЕДАКТИРОВАТЬ: Если, например, у меня есть два кадра данных

df1 = pd.DataFrame({
'C1' : [1.1, 1.2, 1.3],
'C2' : [2.1, 2.2, 2.3],
'C3': [3.1, 3.2, 3.3]},
index=['a', 'b', 'c'])

df2 = pd.DataFrame({
'C3' : [3.1, 3.2, 33.3],
'C4' : [4.1, 4.2, 4.3]},
index=['b', 'c', 'd'])

Мне нужен метод, который позволяет мне создать:

merged = pd.DataFrame({
'C1': [1.1, 1.2, 1.3, 'nan'],
'C2': [2.1, 2.2, 2.3, 'nan'],
'C3': [3.1, 3.2, 3.3, 33.3], 
'C4': ['nan', 4.1, 4.2, 4.3]},
index=['a', 'b', 'c', 'd'])

Ответы [ 2 ]

0 голосов
/ 25 июня 2018

Вот три варианта:

  • Использовать concat/groupby: сначала объединить оба кадра данных по вертикали.Затем сгруппируйте по индексу и выберите первую строку в каждой группе.

  • Использование combine_first: создайте новый индекс, представляющий собой объединение df1 и df2.Переиндексировать df1, используя новый индекс.Затем используйте combine_first, чтобы заполнить NaN значениями от df2.

  • Используйте ручное построение: мы могли бы использовать df2.index.difference(df1.index), чтобы точно определить, какие строки необходимо добавить к df1.Таким образом, мы можем вручную выбрать эти строки из df2 и объединить их в df1.

Для небольших фреймов данных using_concat быстрее.Для больших фреймов данных using_combine_first выглядит немного быстрее, чем другие опции:

import numpy as np
import pandas as pd
import perfplot

def make_dfs(N):
    df1 = pd.DataFrame(np.random.randint(10, size=(N,2)))
    df2 = pd.DataFrame(np.random.randint(10, size=(N,2)), index=range(N//2,N//2 + N))
    return df1, df2

def using_concat(dfs):
    df1, df2 = dfs
    result = pd.concat([df1,df2], sort=False)
    n = result.index.nlevels
    return result.groupby(level=range(n)).first()

def using_combine_first(dfs):
    df1, df2 = dfs
    index = df1.index.union(df2.index)
    result = df1.reindex(index)
    result = result.combine_first(df2)
    return result

def using_manual_construction(dfs):
    df1, df2 = dfs
    index = df2.index.difference(df1.index)
    cols = df2.columns.difference(df1.columns)
    result = pd.concat([df1, df2.loc[index]], sort=False)
    result.loc[df2.index, cols] = df2
    return result

perfplot.show(
    setup=make_dfs,
    kernels=[using_concat, using_combine_first, 
             using_manual_construction],
    n_range=[2**k for k in range(5,21)],
    logx=True,
    logy=True,
    xlabel='len(df)')

enter image description here

0 голосов
/ 25 июня 2018

Не видя ваш код, я могу дать только общий ответ:

Чтобы объединить 2 кадра данных, используйте

df3 = pd.merge(df1, df2, how='right', on=('col1', 'col2'))

или

a.merge(b, how='right', on=('c1', 'c2'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...