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
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
@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
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