Ошибка при объединении 2 фреймов данных с индексами в виде списка строк - PullRequest
1 голос
/ 04 ноября 2019

Мне нужно объединить 2 фрейма данных, индексы которых являются строками. Однако я сталкиваюсь со следующей ошибкой:

TypeError: Cannot concatenate list of ['DataFrame', 'DataFrame']

Я провел некоторое исследование, но не нашел объяснения этой ошибке.

Вот пример того, что происходит:

Кадр данных 1:

    a=pd.DataFrame({'a1':[1,2,3],'a2':[3,4,5],'i':[7,10,11]})

Кадр данных 2:

    b=pd.DataFrame({'b1':[5,6],'b2':[7,8],'i':[7,11]})

Если я сбрасываю индекс настолбцы 'i' , то есть список целых чисел , я могу достичь желаемого результата, как показано ниже:

код:

    import pandas as pd

    a=pd.DataFrame({'a1':[1,2,3],'a2':[3,4,5],'i':[7,10,11]})

    b=pd.DataFrame({'b1':[5,6],'b2':[7,8],'i':[7,11]})

    print('\na:\n',a,'\n\nb:\n',b)

    new_a = a.set_index('i', drop=True)

    new_b=b.set_index('i', drop=True)

    print('\nnew_a:\n',new_a,'\n\nnew_b:\n',new_b)

    c = pd.concat([new_a,new_b],axis=1)

    print('\n\nc:\n',c,'\n')

вывод:

    a:
        a1  a2   i
    0   1   3   7
    1   2   4  10
    2   3   5  11 

    b:
        b1  b2   i
    0   5   7   7
    1   6   8  11

    new_a:
         a1  a2
    i         
    7    1   3
    10   2   4
    11   3   5 

    new_b:
         b1  b2
    i         
    7    5   7
    11   6   8 

    c:
         a1  a2   b1   b2
    i                   
    7    1   3  5.0  7.0
    10   2   4  NaN  NaN
    11   3   5  6.0  8.0 

Однако, если я сбрасываю индекс на столбцы 'i' , то есть список строк , возникает ошибка, как показано ниже:

код:

    import pandas as pd

    a=pd.DataFrame({'a1':[1,2,3],'a2':[3,4,5],'i':['i7','i10','i11']})

    b=pd.DataFrame({'b1':[5,6],'b2':[7,8],'i':['i7','i11']})

    print('\na:\n',a,'\n\nb:\n',b)

    new_a = a.set_index('i', drop=True)

    new_b=b.set_index('i', drop=True)

    print('\nnew_a:\n',new_a,'\n\nnew_b:\n',new_b)

    c = pd.concat([new_a,new_b],axis=1)

    print('\n\nc:\n',c,'\n')

вывод:

    a:
        a1  a2    i
    0   1   3   i7
    1   2   4  i10
    2   3   5  i11 

    b:
        b1  b2    i
    0   5   7   i7
    1   6   8  i11

    new_a:
          a1  a2
    i          
    i7    1   3
    i10   2   4
    i11   3   5 

    new_b:
          b1  b2
    i          
    i7    5   7
    i11   6   8

    Traceback (most recent call last):

      File "<ipython-input-266-6b35fe042e4a>", line 13, in <module>
        c = pd.concat([new_a,new_b],axis=1)

      File "C:\mypath\concat.py", line 225, in concat
        copy=copy, sort=sort)

      File "C:\Users\mypath\concat.py", line 378, in __init__
        self.new_axes = self._get_new_axes()

      File "C:\Users\mypath\concat.py", line 445, in _get_new_axes
        new_axes[i] = self._get_comb_axis(i)

      File "C:\Users\mypath\concat.py", line 470, in _get_comb_axis
        .format(types=types))

    TypeError: Cannot concatenate list of ['DataFrame', 'DataFrame']

Если кто-нибудь может помочь мне разобраться в чем проблема, я буду признателен.

Спасибо.

1 Ответ

1 голос
/ 04 ноября 2019

Используйте pd.concat с sort=False:

c = pd.concat([new_a,new_b],axis=1,sort=False)

, если предыдущая опция не работает, используйте: DataFrame.merge

c=a.merge(b,on='i',how='outer').set_index('i')

Выход:

     a1  a2   b1   b2
i7    1   3  5.0  7.0
i10   2   4  NaN  NaN
i11   3   5  6.0  8.0
...