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?
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
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.
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?
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
>>>
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