Hướng dẫn thêm cột trong python

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.Seriesvà cố gắng gán nó cho 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.Seriesmặc định có một chỉ số được liệt kê từ 0 đến n. [] =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ó pd.Seriesvà 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.ndarrayhoặ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.Seriesthành là chỉ mục của dflà 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.assignlà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.assignrằ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 selfsau đó". 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.

29 hữu ích 1 bình luận chia sẻ

Chủ Đề