numpy配列を列としてPandasデータフレームに追加します


85

次のような形状(X、Y)のPandasデータフレームオブジェクトがあります。

[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

形状(X、Z)のでこぼこしたスパース行列(CSC)は、次のようになります。

[[0, 1, 0],
[0, 0, 1],
[1, 0, 0]]

データフレームが次のようになるように、マトリックスのコンテンツを新しい名前付き列のデータフレームに追加するにはどうすればよいですか。

[[1, 2, 3, [0, 1, 0]],
[4, 5, 6, [0, 0, 1]],
[7, 8, 9, [1, 0, 0]]]

データフレームの形状が(X、Y + 1)になり、マトリックスの行がデータフレームの要素になっていることに注意してください。


2
この種の入れ子はお勧めしません。なぜこれを行う必要があるのですか?
フィリップクラウド

この質問を参照してください:stackoverflow.com/q/18641148/564538
Phillip Cloud

マージ後、単一の列名でマトリックスの前のコンテンツを選択する可能性を保持したいと思います。
ミハイダミアン2013

2つだけ使ってみませんDataFrameか?
フィリップクラウド

回答:


81
import numpy as np
import pandas as pd
import scipy.sparse as sparse

df = pd.DataFrame(np.arange(1,10).reshape(3,3))
arr = sparse.coo_matrix(([1,1,1], ([0,1,2], [1,2,0])), shape=(3,3))
df['newcol'] = arr.toarray().tolist()
print(df)

収量

   0  1  2     newcol
0  1  2  3  [0, 1, 0]
1  4  5  6  [0, 0, 1]
2  7  8  9  [1, 0, 0]

6
このようなことを主張するユーザーに防弾シューズを提供することはできないと思います:/
Phillip Cloud

6
ありますが、リストの列で行うことができます興味深いことは、私はむしろ、これは必ずしも悪いアイデアであると仮定しないと思いますので、。私は同意しますが、そうなる可能性が高いです。
unutbu 2013

1
これはpandas柔軟性の素晴らしい例です。この質問の場合、データはすでに同じ形状の行を持つ同種の数値型ですが、その例では、データlistの長さが異なります。私はあなたができる面白いことがあることに同意します。しかし、すでにマトリックスを持っているのに、なぜそれをリストのリストに変えるのですか?
フィリップクラウド

1
「面白いこと」がある...それなっていない(それは便利ですので)もうリストの列!
Andy Hayden

54
創造的な人々が他の誰もが愚かだと思うことをすることが許されるとき、世界はより良い場所です。:)
unutbu 2013

10

列に配列を格納するのではなく、より高次元のデータ構造(パネル)を使用することを検討してください。

In [11]: p = pd.Panel({'df': df, 'csc': csc})

In [12]: p.df
Out[12]: 
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

In [13]: p.csc
Out[13]: 
   0  1  2
0  0  1  0
1  0  0  1
2  1  0  0

断面積などを見てください。

In [14]: p.xs(0)
Out[14]: 
   csc  df
0    0   1
1    1   2
2    0   3

パネルの詳細については、ドキュメントを参照してください


12
パネルは非推奨になりました
guhur 2017年

はい、通常、MultiIndexが最近推奨されています。たとえばを介して作成されpd.concat([df, csc], axis=1, keys=["df", "csc"])ます。
アンディ・ヘイデン2017年

A = np.eye(3); df = pd.concat( [A,A], axis=1 )-> TypeError:20.2で非NDFrameオブジェクトを連結できませんか?(「pandas-deprecated-now-use-this」のウィキがいいでしょう。)
denis 2017

@denis tryA = pd.DataFrame(np.eye(3)); df = pd.concat( [A,A], axis=1, keys=["A", "B"] )
Andy Hayden

ありがとう、df.columns MultiIndex(levels=[[u'A', u'B'], [0, 1, 2]](額を平手打ち)
denis 2017

3

他の例を次に示します。

import numpy as np
import pandas as pd

""" This just creates a list of touples, and each element of the touple is an array"""
a = [ (np.random.randint(1,10,10), np.array([0,1,2,3,4,5,6,7,8,9]))  for i in 
range(0,10) ]

""" Panda DataFrame will allocate each of the arrays , contained as a touple 
element , as column"""
df = pd.DataFrame(data =a,columns=['random_num','sequential_num'])

一般的な秘密は、a = [(array_11、array_12、...、array_1n)、...、(array_m1、array_m2、...、array_mn)]の形式でデータを割り当てることであり、pandaDataFrameがデータを順序付けます配列のn列。もちろん、touplesの代わりに配列の配列を使用することもできます。その場合、形式は次のようになります。a= [[array_11、array_12、...、array_1n]、...、[array_m1、array_m2、...、array_mn ]]

上記のコードからprint(df)を実行した場合の出力は次のとおりです。

                       random_num                  sequential_num
0  [7, 9, 2, 2, 5, 3, 5, 3, 1, 4]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1  [8, 7, 9, 8, 1, 2, 2, 6, 6, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2  [3, 4, 1, 2, 2, 1, 4, 2, 6, 1]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3  [3, 1, 1, 1, 6, 2, 8, 6, 7, 9]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4  [4, 2, 8, 5, 4, 1, 2, 2, 3, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5  [3, 2, 7, 4, 1, 5, 1, 4, 6, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6  [5, 7, 3, 9, 7, 8, 4, 1, 3, 1]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7  [7, 4, 7, 6, 2, 6, 3, 2, 5, 6]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8  [3, 1, 6, 3, 2, 1, 5, 2, 2, 9]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9  [7, 2, 3, 9, 5, 5, 8, 6, 9, 8]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

上記の例の他のバリエーション:

b = [ (i,"text",[14, 5,], np.array([0,1,2,3,4,5,6,7,8,9]))  for i in 
range(0,10) ]
df = pd.DataFrame(data=b,columns=['Number','Text','2Elemnt_array','10Element_array'])

dfの出力:

   Number  Text 2Elemnt_array                 10Element_array
0       0  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1       1  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2       2  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3       3  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4       4  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5       5  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6       6  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7       7  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8       8  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9       9  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

配列の他の列を追加する場合は、次のようにします。

df['3Element_array']=[([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3])]

dfの最終出力は次のようになります。

   Number  Text 2Elemnt_array                 10Element_array 3Element_array
0       0  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
1       1  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
2       2  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
3       3  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
4       4  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
5       5  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
6       6  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
7       7  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
8       8  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
9       9  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]

1

これを使用して、データフレームからnumpy配列を追加および取得できます。

import numpy as np
import pandas as pd

df = pd.DataFrame({'b':range(10)}) # target dataframe
a = np.random.normal(size=(10,2)) # numpy array
df['a']=a.tolist() # save array
np.array(df['a'].tolist()) # retrieve array

これは、スパース部分のために私を混乱させた前の答えに基づいており、これはスパースでないnumpyarrrayに対してうまく機能します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.