2012-11-11 45 views
34

Làm cách nào để thêm một mục vào một chuỗi gấu trúc được tuần tự hóa. Tôi biết nó không phải là cách trí nhớ hiệu quả nhất, nhưng tôi vẫn cần phải làm điều đó.Cách thêm một mục vào một Loạt gấu trúc

Something cùng:

>> x = Series() 
>> N = 4 
>> for i in xrange(N): 
>>  x.some_appending_function(i**2)  
>> print x 

0 | 0 
1 | 1 
2 | 4 
3 | 9 

cũng có, làm thế nào tôi có thể thêm một hàng duy nhất để một DataFrame gấu trúc?

Trả lời

30

Cách thêm một mục. Đây không phải là rất hiệu quả nhưng sau những gì bạn đang yêu cầu:

x = p.Series() 
N = 4 
for i in xrange(N): 
    x = x.set_value(i, i**2) 

sản xuất x:

0 0 
1 1 
2 4 
3 9 

Rõ ràng có những cách tốt hơn để tạo ra loạt bài này chỉ trong một shot.

Đối với câu hỏi kiểm tra câu hỏi thứ hai và các tham chiếu của câu hỏi SO add one row in a pandas.DataFrame.

+0

Bạn đang sử dụng phiên bản nào? Tôi đang sử dụng 0,14,1 và tôi nhận được lỗi sau: 'Chỉ mụcLỗi: chỉ mục 0 nằm ngoài giới hạn cho trục 0 với kích thước 0' – Ben

+0

@Ben, không chắc chắn, câu trả lời là hơn 2 tuổi. Tôi đã thử nghiệm với 0.15.0 và nó hoạt động hoàn hảo. Bạn có đang thực thi ** mã chính xác ** không? – joaquin

+0

Vâng, tôi chỉ dán mã trực tiếp vào bảng điều khiển mới. Thật kỳ lạ nó dường như bây giờ làm việc! – Ben

12

Bạn có thể sử dụng hàm chắp thêm để thêm phần tử khác vào nó. Chỉ, tạo ra một loạt các yếu tố mới, trước khi bạn nối nó:

test.append(pd.Series(200, index=[101])) 
+1

Tôi tin rằng phụ thêm trả về một Series mới (thay vì thực hiện nó tại chỗ) vì vậy bạn muốn 'test = test.append (pd.Series (200, index = [101]))' –

3

Thêm vào joquin của trả lời các hình thức sau đây có thể là một chút bụi (ít nhất là đẹp hơn để đọc):

x = p.Series() 
N = 4 
for i in xrange(N): 
    x[i] = i**2 

mà sẽ tạo ra cùng một sản lượng

cũng có, một chút ít chính thống nhưng nếu bạn muốn chỉ cần thêm một yếu tố duy nhất để cuối cùng:

x=p.Series() 
value_to_append=5 
x[len(x)]=value_to_append 
7

Nếu bạn có chỉ mục và giá trị. Sau đó, bạn có thể thêm vào Series là:

obj = Series([4,7,-5,3]) 
obj.index=['a', 'b', 'c', 'd'] 

obj['e'] = 181 

điều này sẽ thêm giá trị mới vào Series (ở cuối Series).

19

TLDR: không thêm mục vào một loạt từng người một, tốt hơn mở rộng với một bộ sưu tập ra lệnh

Tôi nghĩ câu hỏi trong hình thức hiện tại của nó là một chút khéo léo. Và câu trả lời được chấp nhận trả lời câu hỏi. Nhưng tôi càng sử dụng gấu trúc, tôi càng hiểu rằng đó là một ý tưởng tồi khi gắn thêm các mục vào từng Series một. Tôi sẽ cố gắng giải thích lý do tại sao cho người mới bắt đầu gấu trúc. Bạn có thể nghĩ rằng việc thêm dữ liệu vào một Series nhất định có thể cho phép bạn sử dụng lại một số tài nguyên, nhưng trên thực tế, một Series chỉ là một container lưu trữ mối quan hệ giữa một chỉ mục và một mảng giá trị. Mỗi cái là một numpy.array dưới mui xe, và chỉ mục là bất biến. Khi bạn thêm vào chuỗi một mục có nhãn bị thiếu trong chỉ mục, chỉ mục mới có kích thước n + 1 được tạo và mảng giá trị mới có cùng kích thước. Điều đó có nghĩa là khi bạn nối từng mục một, bạn tạo thêm hai mảng n + 1 trên mỗi bước.

Nhân tiện, bạn không thể chắp thêm mục mới theo vị trí (bạn sẽ nhận được chỉ mục) và nhãn trong chỉ mục không nhất thiết phải là duy nhất, đó là khi bạn gán giá trị với nhãn, bạn chỉ định giá trị cho tất cả các mục hiện có với nhãn và một hàng mới không được thêm vào trong trường hợp này. Điều này có thể dẫn đến lỗi tinh tế.

Tính đạo đức của câu chuyện là bạn không nên nối thêm từng dữ liệu, bạn nên mở rộng bằng bộ sưu tập có thứ tự. Vấn đề là bạn không thể mở rộng một Series tại chỗ. Đó là lý do tại sao tốt hơn là tổ chức mã của bạn để bạn không cần phải cập nhật một phiên bản cụ thể của một Series bằng cách tham chiếu.

Nếu bạn tự tạo nhãn và chúng đang tăng, cách dễ nhất là thêm các mục mới vào từ điển, sau đó tạo một Series mới từ từ điển (sắp xếp khóa) và nối Series vào danh sách cũ. Nếu các phím không tăng, thì bạn sẽ cần phải tạo hai danh sách riêng biệt cho các nhãn mới và các giá trị mới.

Dưới đây là một số mẫu mã:

In [1]: import pandas as pd 
In [2]: import numpy as np 

In [3]: s = pd.Series(np.arange(4)**2, index=np.arange(4)) 

In [4]: s 
Out[4]: 
0 0 
1 1 
2 4 
3 9 
dtype: int64 

In [6]: id(s.index), id(s.values) 
Out[6]: (4470549648, 4470593296) 

Khi chúng tôi cập nhật một mục hiện có, chỉ số và các mảng giá trị giữ nguyên (nếu bạn không thay đổi kiểu giá trị)

In [7]: s[2] = 14 

In [8]: id(s.index), id(s.values) 
Out[8]: (4470549648, 4470593296) 

Nhưng khi bạn thêm một mục mới, một chỉ số mới và một mảng các giá trị mới được tạo ra:

In [9]: s[4] = 16 

In [10]: s 
Out[10]: 
0  0 
1  1 
2 14 
3  9 
4 16 
dtype: int64 

In [11]: id(s.index), id(s.values) 
Out[11]: (4470548560, 4470595056) 

Đó i s nếu bạn định nối thêm một số mục, hãy thu thập chúng trong từ điển, tạo một Series, thêm nó vào cái cũ và lưu kết quả:

In [13]: new_items = {item: item**2 for item in range(5, 7)} 

In [14]: s2 = pd.Series(new_items) 

In [15]: s2 # keys are guaranteed to be sorted! 
Out[15]: 
5 25 
6 36 
dtype: int64 

In [16]: s = s.append(s2); s 
Out[16]: 
0  0 
1  1 
2 14 
3  9 
4 16 
5 25 
6 36 
dtype: int64 
Các vấn đề liên quan