Pandas 데이터 프레임에 열로 numpy 배열 추가


82

다음과 같은 모양 (X, Y)의 Pandas 데이터 프레임 개체가 있습니다.

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

다음과 같은 모양 (X, Z)의 numpy 희소 행렬 (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
이러한 종류의 중첩은 권장되지 않습니다. 왜 이렇게해야합니까?
Phillip Cloud

이 질문을 참조하십시오 : stackoverflow.com/q/18641148/564538
Phillip Cloud

병합 후 단일 열 이름으로 행렬의 이전 내용을 선택할 가능성을 유지하고 싶습니다.
Mihai Damian 2013 년

두 개의 DataFrames를 사용하지 않는 이유는 무엇 입니까?
Phillip Cloud

답변:


78
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
나는 우리가 정말이 같은 일을 주장하는 사용자를위한 신발 방탄 제공 할 수없는 것 같아요 : /
필립 클라우드

6
거기 당신이 목록의 열을 함께 할 수있는 재미있는 일들이 차라리이 반드시 나쁜 생각 생각하지 않는 게 좋을 그래서. 동의하지만 그럴 가능성이 높습니다.
unutbu

1
pandas유연성 의 훌륭한 예입니다 . 질문 의 경우 데이터는 이미 동일한 모양의 행을 가진 동종 숫자 유형이지만이 예에서는 list길이가 서로 다릅니다. 나는 당신이 할 수있는 흥미로운 일이 있다는 것에 동의합니다. 그러나 이미 행렬이있는 경우 목록 목록으로 바꾸는 이유는 무엇입니까?
Phillip Cloud

1
"흥미로운 것"이 있습니다. 더 이상 목록 열이 아닙니다 (유용합니다)!
Andy Hayden

51
창의적인 사람들이 다른 사람들이 어리 석다고 생각하는 일을하도록 허용 될 때 세상은 더 나은 곳입니다. :)
unutbu 2013 년

10

열에 배열을 저장하는 대신 더 높은 차원의 데이터 구조 ( Panel )를 사용하는 것이 좋습니다.

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

패널에 대한 자세한 내용은 문서를 참조하십시오 .


11
패널은 이제 더 이상 사용되지 않습니다
guhur

예, 요즘에는 일반적으로 MultiIndex가 권장됩니다. 예를 들어 pd.concat([df, csc], axis=1, keys=["df", "csc"]).
Andy Hayden

A = np.eye(3); df = pd.concat( [A,A], axis=1 )-> TypeError : 20.2에서 비 NDFrame 객체를 연결할 수 없습니까? (. "팬더-되지-지금 사용-이"될 좋은의 위키)
데니스

@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]](때려 이마)
데니스

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)] 형식으로 데이터를 할당하는 것입니다. panda DataFrame은 데이터를 정렬합니다. 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]

0

일반적인 numpy 배열의 경우 데이터 프레임에서 추가하고 검색하려면 이렇게 할 수 있습니다. 그것은 정상적인 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

0
df = pd.DataFrame(np.arange(1,10).reshape(3,3))
df['newcol'] = pd.Series(your_2d_numpy_array)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.