web-dev-qa-db-ja.com

Pandasデータフレーム?

これは、5回繰り返す必要がある私のデータフレームです。

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

私はこのような結果が欲しい:

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

ただし、追加し続けるよりも賢い方法が必要です。実際には、作業中のデータフレームImを50回繰り返す必要があります。

np.repeatのようなものを含めて、実用的なものは見つかりませんでした----データフレームでは機能しません。

誰も助けてもらえますか?

34
lsheng

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

インデックスではなく値のみを繰り返したい場合は、次のようにします。

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
54
joris

iloc を使用する方がよりクリーンで速いと思う

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

より一般的には、 tile または repeatarange と組み合わせて使用​​できます。

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

注:これは、整数以外のインデックス付きDataFrame(およびSeries)で機能します。

14
Andy Hayden

あなたの問題が本当にそれを必要としない限り、私は一般的に繰り返したり追加したりしません-それは非常に非効率的であり、通常は問題を攻撃する適切な方法を理解していないことに由来します。

正確なユースケースはわかりませんが、値が次のように保存されている場合

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

仕事をします。おそらく、あなたが達成しようとしていることをよりよく説明したいですか?

1
FooBar

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
U10-Forward

追加も機能するはずです:

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