115 votes

Version Pandas de rbind

Dans R, vous pouvez combiner deux dataframes en collant les colonnes de l'un sur le bas des colonnes de l'autre à l'aide de rbind. Dans pandas, comment faire la même chose ? Cela semble étrangement difficile.

L'utilisation de append donne lieu à un désordre horrible comprenant des NaN et d'autres choses pour des raisons que je ne comprends pas. J'essaie simplement de "lier" deux images identiques qui ressemblent à ceci :

EDIT : Je créais les DataFrames d'une manière stupide, ce qui causait des problèmes. Append=rbind à toutes fins utiles. Voir la réponse ci-dessous.

        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

Mais je reçois quelque chose d'horrible comme ça :

        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  

Et je ne comprends pas pourquoi. R commence à me manquer :(

76voto

B.Mr.W. Points 8215

pd.concat servira à rbind en 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]))

Le résultat sera le suivant :

   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

Si vous lisez attentivement la documentation, elle expliquera également d'autres opérations comme cbind, ..etc.

56voto

N. McA. Points 1617

Ah, c'est lié à la façon dont j'ai créé le DataFrame, pas à la façon dont je les ai combinés. En résumé, si vous créez un cadre à l'aide d'une boucle et d'une instruction qui ressemble à celle-ci :

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

Vous devez ignorer l'indice

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

Sinon, vous aurez des problèmes plus tard lorsque vous combinerez les données.

35voto

abudis Points 1767

Cela a marché pour moi :

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)

Rendement :

                   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

Si vous n'utilisez pas déjà la dernière version de pandas Je recommande vivement la mise à niveau. Il est maintenant possible d'opérer avec des DataFrames qui contiennent des indices dupliqués.

4voto

Bem Ostap Points 61
import pandas as pd 
import numpy as np

Si vous avez un DataFrame comme ça :

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

Et vous voulez ajouter un peu de NOUVELLE RANGÉE qui est une liste (ou un autre objet itérable) :

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

Vous devez transformer la liste en dictionnaire avec des clés égales aux colonnes dans le DataFrame avec zip() fonction :

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

Vous pouvez alors utiliser append() pour ajouter un nouveau dictionnaire :

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

N.B. les index sont abandonnés.

Et oui, ce n'est pas aussi simple que cbind() en R :(

3voto

Panwen Wang Points 1824

dplyr 's bind_rows fait la même chose.

En python, vous pouvez procéder de la même manière :

>>> from datar.all import bind_rows, head, tail
>>> from datar.datasets import iris
>>> 
>>> iris >> head(3) >> bind_rows(iris >> tail(3))
   Sepal_Length  Sepal_Width  Petal_Length  Petal_Width    Species
      <float64>    <float64>     <float64>    <float64>   <object>
0           5.1          3.5           1.4          0.2     setosa
1           4.9          3.0           1.4          0.2     setosa
2           4.7          3.2           1.3          0.2     setosa
3           6.5          3.0           5.2          2.0  virginica
4           6.2          3.4           5.4          2.3  virginica
5           5.9          3.0           5.1          1.8  virginica

Je suis l'auteur du datar paquet. N'hésitez pas à nous soumettre des problèmes si vous avez des questions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X