Pandas версія rbind


76

У R ви можете поєднати два кадри даних, приклеївши стовпці одного до нижньої частини стовпців іншого, використовуючи rbind. Як ви робите в пандах те саме? Це здається химерно важким.

Використання додатка призводить до жахливого безладу, включаючи NaN та інші речі з причин, які я не розумію. Я просто намагаюся "зв'язати" два однакові кадри, які виглядають так:

EDIT: Я створював DataFrames по-дурному, що спричиняло проблеми. Додати = rbind до всіх намірів і цілей. Дивіться відповідь нижче.

        0         1       2        3          4          5        6                    7
0   ADN.L  20130220   437.4   442.37   436.5000   441.9000  2775364  2013-02-20 18:47:42
1   ADM.L  20130220  1279.0  1300.00  1272.0000  1285.0000   967730  2013-02-20 18:47:42
2   AGK.L  20130220  1717.0  1749.00  1709.0000  1739.0000   834534  2013-02-20 18:47:43
3  AMEC.L  20130220  1030.0  1040.00  1024.0000  1035.0000  1972517  2013-02-20 18:47:43
4   AAL.L  20130220  1998.0  2014.50  1942.4999  1951.0000  3666033  2013-02-20 18:47:44
5  ANTO.L  20130220  1093.0  1097.00  1064.7899  1068.0000  2183931  2013-02-20 18:47:44
6   ARM.L  20130220   941.5   965.10   939.4250   951.5001  2994652  2013-02-20 18:47:45

Але я отримую щось жахливе а-ля це:

        0         1        2        3          4         5        6                    7       0         1       2        3          4          5        6                    7
0     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADN.L  20130220   437.4   442.37   436.5000   441.9000  2775364  2013-02-20 18:47:42
1     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADM.L  20130220  1279.0  1300.00  1272.0000  1285.0000   967730  2013-02-20 18:47:42
2     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   AGK.L  20130220  1717.0  1749.00  1709.0000  1739.0000   834534  2013-02-20 18:47:43
3     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN  AMEC.L  20130220  1030.0  1040.00  1024.0000  1035.0000  1972517  2013-02-20 18:47:43
4     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   AAL.L  20130220  1998.0  2014.50  1942.4999  1951.0000  3666033  2013-02-20 18:47:44
5     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN  ANTO.L  20130220  1093.0  1097.00  1064.7899  1068.0000  2183931  2013-02-20 18:47:44
6     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ARM.L  20130220   941.5   965.10   939.4250   951.5001  2994652  2013-02-20 18:47:45
0     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADN.L  20130220   437.4   442.37   436.5000   441.9000  2775364  2013-02-20 18:47:42
1     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   ADM.L  20130220  1279.0  1300.00  1272.0000  1285.0000   967730  2013-02-20 18:47:42
2     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN   AGK.L  20130220  1717.0  1749.00  1709.0000  1739.0000   834534  2013-02-20 18:47:43
3     NaN       NaN      NaN      NaN        NaN       NaN      NaN                  NaN  

І я не розумію, чому. Я починаю сумувати за R :(



concat більше схожий на rbind, ніж на додавання. Див. Коментар @Seth
CnrL

Зокрема, конкатенація за допомогою append має простий приклад:df = pd.DataFrame([[1, 2], [3, 4]], columns=list('AB')) df2 = pd.DataFrame([[5, 6], [7, 8]], columns=list('AB')) df.append(df2)
Paul Rougieux

Див. Також фрейм даних conndas concat vs append : "append і concat [майже] еквівалентні" ... "Append - це конкретний випадок (вісь = 0, join = 'external') concat".
Paul Rougieux

Відповіді:


43

Ах, це пов’язано з тим, як я створив DataFrame, а не з тим, як я їх комбінував. Довгий і короткий його, якщо ви створюєте фрейм, використовуючи цикл і оператор, який виглядає так:

Frame = Frame.append(pandas.DataFrame(data = SomeNewLineOfData))

Ви повинні ігнорувати індекс

Frame = Frame.append(pandas.DataFrame(data = SomeNewLineOfData), ignore_index=True)

Або у вас виникнуть проблеми пізніше при об'єднанні даних.


2
Отже, оглядаючись на це деякий час після того, як задав питання, я думаю, що варто зазначити, що це - жахливий спосіб зробити фрейм даних . Складання списку диктовок, а потім виклик конструктора є кращим.
Н. Мака.

Або, ще краще: не викликайте df.appendвнутрішній цикл, це квадратична складність. Натомість додайте DataFrames до списку та зателефонуйте pd.concatв кінці.
cs95

30

Це спрацювало для мене:

import numpy as np
import pandas as pd

dates = np.asarray(pd.date_range('1/1/2000', periods=8))
df1 = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
df2 = df1.copy()
df = df1.append(df2)

Урожайність:

                   A         B         C         D
2000-01-01 -0.327208  0.552500  0.862529  0.493109
2000-01-02  1.039844 -2.141089 -0.781609  1.307600
2000-01-03 -0.462831  0.066505 -1.698346  1.123174
2000-01-04 -0.321971 -0.544599 -0.486099 -0.283791
2000-01-05  0.693749  0.544329 -1.606851  0.527733
2000-01-06 -2.461177 -0.339378 -0.236275  0.155569
2000-01-07 -0.597156  0.904511  0.369865  0.862504
2000-01-08 -0.958300 -0.583621 -2.068273  0.539434
2000-01-01 -0.327208  0.552500  0.862529  0.493109
2000-01-02  1.039844 -2.141089 -0.781609  1.307600
2000-01-03 -0.462831  0.066505 -1.698346  1.123174
2000-01-04 -0.321971 -0.544599 -0.486099 -0.283791
2000-01-05  0.693749  0.544329 -1.606851  0.527733
2000-01-06 -2.461177 -0.339378 -0.236275  0.155569
2000-01-07 -0.597156  0.904511  0.369865  0.862504
2000-01-08 -0.958300 -0.583621 -2.068273  0.539434

Якщо ви ще не використовуєте останню версію, pandasнастійно рекомендую оновити. Тепер можна працювати з DataFrames, які містять повторювані індекси.


чи піп не дає останніх панд?
Н. Мака.

@ N.McA. Так, слід. Ви можете перевірити це так - pd.version.version.
abudis

26

pd.concatбуде служити меті rbindв R.

import pandas as pd
df1 = pd.DataFrame({'col1': [1,2], 'col2':[3,4]})
df2 = pd.DataFrame({'col1': [5,6], 'col2':[7,8]})
print(df1)
print(df2)
print(pd.concat([df1, df2]))

Результат буде виглядати так:

   col1  col2
0     1     3
1     2     4
   col1  col2
0     5     7
1     6     8
   col1  col2
0     1     3
1     2     4
0     5     7
1     6     8

Якщо ви уважно прочитаєте документацію, вона також пояснить інші операції, такі як cbind, .. тощо.


2
import pandas as pd 
import numpy as np

Якщо у вас є такий DataFrame :

array = np.random.randint( 0,10, size = (2,4) )
df = pd.DataFrame(array, columns = ['A','B', 'C', 'D'], \ 
                           index = ['10aa', '20bb'] )  ### some crazy indexes
df

      A  B  C  D
10aa  4  2  4  6
20bb  5  1  0  2

І ви хочете додати деяку нову рядок , яка представляє собою список (або інший об'єкт ітерації):

List = [i**3 for i in range(df.shape[1]) ]
List
[0, 1, 8, 27]

Ви повинні перетворити список на словник з ключами, що дорівнює стовпцям у DataFrame за допомогою функції zip () :

Dict = dict(  zip(df.columns, List)  )
Dict
{'A': 0, 'B': 1, 'C': 8, 'D': 27}

Потім ви можете використовувати метод append () для додавання нового словника:

df = df.append(Dict, ignore_index=True)
df
    A   B   C   D
0   7   5   5   4
1   5   8   4   1
2   0   1   8   27

NB індекси падають.

І так, це не так просто, як cbind () у R :(

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.