Bài tập cột siêu đơn giản
Một khung dữ liệu gấu trúc được triển khai dưới dạng một lệnh của các cột.
Điều này có nghĩa là __getitem__
[]
không chỉ có thể được sử dụng để có được một cột nhất định mà còn __setitem__
[] =
có thể được sử dụng để gán một cột mới.
Ví dụ, dataframe này có thể có một cột thêm vào nó bằng cách đơn giản bằng cách sử dụng []
accessor
size name color
0 big rose red
1 small violet blue
2 small tulip red
3 small harebell blue
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
Lưu ý rằng điều này hoạt động ngay cả khi chỉ mục của khung dữ liệu bị tắt.
df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
[] = là cách để đi, nhưng xem ra!
Tuy nhiên, nếu bạn có một pd.Series
và cố gắng gán nó vào một khung dữ liệu nơi các chỉ mục bị tắt, bạn sẽ gặp rắc rối. Xem ví dụ:
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
Điều này là do pd.Series
mặc định có một chỉ số được liệt kê từ 0 đến n. Và [] =
phương pháp gấu trúc cố gắng trở nên "thông minh"
Điều gì thực sự đang diễn ra.
Khi bạn sử dụng [] =
phương thức gấu trúc đang lặng lẽ thực hiện phép nối ngoài hoặc hợp nhất bên ngoài bằng cách sử dụng chỉ mục của khung dữ liệu bên trái và chỉ mục của chuỗi bên phải.df['column'] = series
Lưu ý bên
Điều này nhanh chóng gây ra sự bất hòa về nhận thức, vì []=
phương pháp này đang cố gắng thực hiện nhiều thứ khác nhau tùy thuộc vào đầu vào và kết quả không thể dự đoán được trừ khi bạn chỉ biết gấu trúc hoạt động như thế nào. Do đó tôi sẽ khuyên chống lại các []=
cơ sở mã, nhưng khi khám phá dữ liệu trong một cuốn sổ tay, nó vẫn ổn.
Đi xung quanh vấn đề
Nếu bạn có một pd.Series
và muốn nó được gán từ trên xuống dưới hoặc nếu bạn đang mã hóa mã sản xuất và bạn không chắc chắn về thứ tự chỉ mục, thì đáng để bảo vệ cho loại vấn đề này.
Bạn có thể hạ thấp pd.Series
đến một np.ndarray
hoặc một list
, điều này sẽ thực hiện các mẹo.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values
hoặc là
df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))
Nhưng điều này không rõ ràng lắm.
Một số lập trình viên có thể đi cùng và nói "Này, điều này có vẻ dư thừa, tôi sẽ chỉ tối ưu hóa điều này".
Cách rõ ràng
Đặt chỉ mục của pd.Series
thành là chỉ mục của df
là rõ ràng.
df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)
Hoặc thực tế hơn, bạn có thể pd.Series
đã có sẵn.
protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index
3 no
2 no
1 no
0 yes
Bây giờ có thể được chỉ định
df['protected'] = protected_series
size name color protected
3 big rose red no
2 small violet blue no
1 small tulip red no
0 small harebell blue yes
Cách khác với df.reset_index()
Vì sự bất đồng về chỉ số là vấn đề, nếu bạn cảm thấy rằng chỉ mục của khung dữ liệu không nên ra lệnh, bạn có thể bỏ chỉ mục, điều này sẽ nhanh hơn, nhưng nó không sạch lắm, vì chức năng của bạn bây giờ có thể thực hiện hai điều.
df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series
size name color protected
0 big rose red no
1 small violet blue no
2 small tulip red no
3 small harebell blue yes
Lưu ý về df.assign
Trong khi df.assign
làm cho nó rõ ràng hơn những gì bạn đang làm, nó thực sự có tất cả các vấn đề tương tự như ở trên[]=
df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
size name color protected
3 big rose red yes
2 small violet blue no
1 small tulip red no
0 small harebell blue no
Chỉ cần xem ra df.assign
rằng cột của bạn không được gọi self
. Nó sẽ gây ra lỗi. Điều này làm cho df.assign
có mùi , vì có những loại tạo tác trong chức năng.
df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'
Bạn có thể nói, "Chà, tôi sẽ không sử dụng self
sau đó". Nhưng ai biết chức năng này thay đổi như thế nào trong tương lai để hỗ trợ các đối số mới. Có thể tên cột của bạn sẽ là một đối số trong bản cập nhật mới của gấu trúc, gây ra vấn đề với việc nâng cấp.