Thêm mảng numpy làm cột vào khung dữ liệu Pandas


82

Tôi có một đối tượng khung dữ liệu Pandas có hình dạng (X, Y) trông giống như sau:

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

và một ma trận thưa thớt (CSC) có hình dạng (X, Z) trông giống như thế này

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

Làm cách nào để thêm nội dung từ ma trận vào khung dữ liệu trong một cột được đặt tên mới sao cho khung dữ liệu sẽ kết thúc như thế này:

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

Lưu ý rằng khung dữ liệu bây giờ có hình dạng (X, Y + 1) và các hàng từ ma trận là các phần tử trong khung dữ liệu.


2
Kiểu làm tổ này không được khuyến khích. Tại sao bạn cần phải làm điều này?
Phillip Cloud


Tôi muốn giữ lại khả năng chọn nội dung trước đó của ma trận bằng một tên cột sau khi hợp nhất.
Mihai Damian

Tại sao bạn không chỉ sử dụng hai DataFrames?
Phillip Cloud

Câu trả lời:


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)

hoa lợi

   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
Tôi đoán chúng tôi không thể thực sự cung cấp giày chống đạn cho những người dùng khăng khăng làm những việc như thế này: /
Phillip Cloud

6
những điều thú vị bạn có thể làm với một cột danh sách , vì vậy tôi không muốn cho rằng đây nhất thiết phải là một ý tưởng tồi. Mặc dù tôi đồng ý rằng có khả năng cao là như vậy.
unutbu

1
Đó là một ví dụ tuyệt vời về pandastính linh hoạt. Trong trường hợp của câu hỏi này , dữ liệu đã có kiểu số đồng nhất với các hàng hình bằng nhau, trong khi trong ví dụ đó, chúng có listđộ dài khác nhau. Tôi đồng ý rằng có những điều thú vị bạn có thể làm. Tuy nhiên, khi bạn đã có một ma trận tại sao lại biến nó thành một danh sách các danh sách?
Phillip Cloud

1
"Điều thú vị" ở đó là ... làm cho nó không phải là một cột danh sách nữa (vì vậy nó rất hữu ích)!
Andy Hayden

51
Thế giới là một nơi tốt đẹp hơn khi những người sáng tạo được phép làm những điều mà người khác cho là ngu ngốc. :)
unutbu

10

Cân nhắc sử dụng cấu trúc dữ liệu chiều cao hơn ( Bảng điều khiển ), thay vì lưu trữ một mảng trong cột của bạn:

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

Nhìn vào các mặt cắt, v.v., v.v., v.v.

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

Xem tài liệu để biết thêm về Panels .


11
Bảng điều khiển hiện không được dùng nữa
guhur

Có, ngày nay thường khuyên dùng MultiIndex. Tạo ví dụ: qua pd.concat([df, csc], axis=1, keys=["df", "csc"]).
Andy Hayden

A = np.eye(3); df = pd.concat( [A,A], axis=1 )-> TypeError: không thể nối một đối tượng không phải NDFrame trong 20.2? (Một wiki về "gấu trúc-bị phản đối-bây giờ-sử dụng-cái này" sẽ rất hay.)
denis

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

Cảm ơn, df.columns MultiIndex(levels=[[u'A', u'B'], [0, 1, 2]](vỗ trán)
denis

3

Đây là một ví dụ khác:

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'])

Bí mật nói chung là phân bổ dữ liệu ở dạng a = [(array_11, array_12, ..., array_1n), ..., (array_m1, array_m2, ..., array_mn)] và panda DataFrame sẽ sắp xếp dữ liệu trong n cột của mảng. Tất nhiên, các mảng của mảng có thể được sử dụng thay vì các khối chồng, trong trường hợp đó, dạng sẽ là: a = [[array_11, array_12, ..., array_1n], ..., [array_m1, array_m2, ..., array_mn ]]

Đây là kết quả đầu ra nếu bạn in (df) từ đoạn mã trên:

                       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]

Các biến thể khác của ví dụ trên:

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'])

Đầu ra của 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]

Nếu bạn muốn thêm các cột khác của mảng, thì:

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])]

Đầu ra cuối cùng của df sẽ là:

   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

Đối với các mảng numpy thông thường, để thêm và truy xuất từ ​​khung dữ liệu, bạn có thể thực hiện việc này. Nó được xây dựng dựa trên câu trả lời trước đó khiến tôi bối rối vì phần thưa thớt khi tôi chỉ có một mảng numpy bình thường.

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.