web-dev-qa-db-fra.com

Comment répéter le cadre de données Pandas?

Ceci est mon cadre de données qui doit être répété 5 fois:

>>> x = pd.DataFrame({'a':1,'b':2},index = range(1))
>>> x
   a  b
0  1  2

Je veux avoir le résultat comme ça:

>>> x.append(x).append(x).append(x)
   a  b
0  1  2
0  1  2
0  1  2
0  1  2

Mais il doit y avoir un moyen plus intelligent que de continuer à annexer. En fait, le bloc de données sur lequel je travaille devrait être répété 50 fois ..

Je n'ai rien trouvé de concret, y compris ceux comme np.repeat ---- cela ne fonctionne tout simplement pas sur le cadre de données.

Quelqu'un pourrait-il aider?

30
lsheng

Vous pouvez utiliser la fonction concat:

In [13]: pd.concat([x]*5)
Out[13]: 
   a  b
0  1  2
0  1  2
0  1  2
0  1  2
0  1  2

Si vous voulez seulement répéter les valeurs et pas l'index, vous pouvez faire:

In [14]: pd.concat([x]*5, ignore_index=True)
Out[14]: 
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
50
joris

Je pense que c'est plus propre/plus rapide d'utiliser iloc de nos jours:

In [11]: np.full(3, 0)
Out[11]: array([0, 0, 0])

In [12]: x.iloc[np.full(3, 0)]
Out[12]:
   a  b
0  1  2
0  1  2
0  1  2

Plus généralement, vous pouvez utiliser tile ou repeat avec arange :

In [21]: df = pd.DataFrame([[1, 2], [3, 4]], columns=["A", "B"])

In [22]: df
Out[22]:
   A  B
0  1  2
1  3  4

In [23]: np.tile(np.arange(len(df)), 3)
Out[23]: array([0, 1, 0, 1, 0, 1])

In [24]: np.repeat(np.arange(len(df)), 3)
Out[24]: array([0, 0, 0, 1, 1, 1])

In [25]: df.iloc[np.tile(np.arange(len(df)), 3)]
Out[25]:
   A  B
0  1  2
1  3  4
0  1  2
1  3  4
0  1  2
1  3  4

In [26]: df.iloc[np.repeat(np.arange(len(df)), 3)]
Out[26]:
   A  B
0  1  2
0  1  2
0  1  2
1  3  4
1  3  4
1  3  4

Remarque: Ceci fonctionnera avec les DataFrames (et les séries) non indexés.

11
Andy Hayden

En règle générale, je ne répéterai pas et/ou n’appliquerai pas, à moins que votre problème ne le rend vraiment nécessaire - il est très inefficace et typiquement vient du fait qu’on ne comprend pas la bonne façon d’attaquer un problème.

Je ne connais pas votre cas d'utilisation exact, mais si vos valeurs sont stockées sous la forme

values = array(1, 2)
df2 = pd.DataFrame(index=arange(0,50),  columns=['a', 'b'])
df2[['a', 'b']] = values

va faire le travail. Peut-être que vous voulez mieux expliquer ce que vous essayez de réaliser?

1
FooBar

Essayez d’utiliser numpy.repeat :

>>> df=pd.DataFrame(pd.np.repeat(x.values,5,axis=0),columns=x.columns)
>>> df
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
>>> 
0
U9-Forward

Append devrait fonctionner aussi:

In [589]: x = pd.DataFrame({'a':1,'b':2},index = range(1))

In [590]: x
Out[590]: 
   a  b
0  1  2

In [591]: x.append([x]*5, ignore_index=True) #Ignores the index as per your need
Out[591]: 
   a  b
0  1  2
1  1  2
2  1  2
3  1  2
4  1  2
5  1  2

In [592]: x.append([x]*5)
Out[592]: 
   a  b
0  1  2
0  1  2
0  1  2
0  1  2
0  1  2
0  1  2
0
Surya