Làm cách nào để thêm hậu tố (hoặc tiền tố) vào mỗi tên cột?


89

Tôi muốn thêm _xhậu tố vào mỗi tên cột như sau:

featuresA = myPandasDataFrame.columns.values + '_x'

Làm thế nào để tôi làm điều này? Ngoài ra, nếu tôi muốn thêm x_làm hậu tố, giải pháp sẽ thay đổi như thế nào?

Câu trả lời:


122

Bạn có thể sử dụng một listcách hiểu:

df.columns = [str(col) + '_x' for col in df.columns]

Ngoài ra còn có các phương thức tích hợp như .add_suffix().add_prefix()như đã đề cập trong một câu trả lời khác.


đây là câu trả lời đơn giản và tao nhã nhất!
Jinhua Wang

164

Sau đây là cách tốt nhất để thêm hậu tố theo ý kiến ​​của tôi.

df = df.add_suffix('_some_suffix')

Vì nó là một hàm được gọi trên DataFrame và trả về DataFrame - bạn có thể sử dụng nó trong chuỗi các cuộc gọi.


14
Bạn có thể sử dụng add_prefix nếu bạn muốn thêm tiền tố vào tên.
Jorge

9
Thật tệ là điều này không thể thay đổi được (tức là không có inplace=Truetùy chọn tham số). Nếu không, hoàn hảo.
ijoseph

Tôi nghĩ rằng điều này tốt hơn câu trả lời được chấp nhận trong một số trường hợp, bởi vì nó có thể được sử dụng trong một chuỗi hoạt động trong một câu lệnh duy nhất, thay vì cần câu lệnh riêng của nó.
Thuyền trưởng Lepton

@CaptainLepton khi nào thì câu trả lời này sẽ không tốt hơn câu trả lời được chấp nhận
baxx

1
Nếu hậu tố không phải là hằng số. Tiêu đề nói về các hậu tố. Bài đăng thu hẹp phạm vi thành một hậu tố hằng số duy nhất, nhưng nếu chúng tôi đang trả lời tiêu đề bài đăng theo các thuật ngữ chung, thì việc đặt các cột thông qua danh sách dễ hiểu hoặc có thể lặp lại khác linh hoạt hơn
Captain Lepton

17

Kết nối tại chỗ thanh lịch

Nếu bạn đang cố gắng sửa đổi dftại chỗ, thì tùy chọn rẻ nhất (và đơn giản nhất) là bổ sung tại chỗ trực tiếp trên df.columns(tức là sử dụng Index.__iadd__).

df = pd.DataFrame({"A": [9, 4, 2, 1], "B": [12, 7, 5, 4]})
df

   A   B
0  9  12
1  4   7
2  2   5
3  1   4

df.columns += '_some_suffix'
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Để thêm tiền tố, bạn cũng sẽ sử dụng

df.columns = 'some_prefix_' + df.columns
df

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Một lựa chọn rẻ tiền khác là sử dụng tính năng hiểu danh sách với f-stringđịnh dạng (có sẵn trên python3.6 +).

df.columns = [f'{c}_some_suffix' for c in df]
df

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Và đối với tiền tố, tương tự,

df.columns = [f'some_prefix{c}' for c in df]

Phương pháp Chuỗi

Cũng có thể thực hiện thêm * sửa chữa trong khi chuỗi phương thức. Để thêm hậu tố, hãy sử dụngDataFrame.add_suffix

df.add_suffix('_some_suffix')

   A_some_suffix  B_some_suffix
0              9             12
1              4              7
2              2              5
3              1              4

Điều này trả về một bản sao của dữ liệu. IOW, dfkhông được sửa đổi.

Thêm tiền tố cũng được thực hiện với DataFrame.add_prefix.

df.add_prefix('some_prefix_')

   some_prefix_A  some_prefix_B
0              9             12
1              4              7
2              2              5
3              1              4

Mà cũng không sửa đổi df.


Phê bình add_*fix

Đây là những phương pháp tốt nếu bạn đang cố gắng thực hiện chuỗi phương thức:

df.some_method1().some_method2().add_*fix(...)

Tuy nhiên, add_prefix(và add_suffix) tạo một bản sao của toàn bộ khung dữ liệu, chỉ để sửa đổi các tiêu đề. Nếu bạn tin rằng điều này là lãng phí, nhưng vẫn muốn chuỗi, bạn có thể gọi pipe:

def add_suffix(df):
    df.columns += '_some_suffix'
    return df

df.some_method1().some_method2().pipe(add_suffix)

Đây là sự thanh lịch! Điều gì xảy ra nếu bạn muốn thêm tiền tố hoặc hậu tố vào một tập hợp con của các cột, ví dụ như các cột có tên đều chứa một từ chung (như newhoặc old) thay vì mỗi cột? Cảm ơn.
Bowen Liu

1
@BowenLiu Tôi khuyên bạn nên sử dụng df.rename () để thay thế ... Chuyển tên ánh xạ từ điển sang tên mới của chúng. Sau đó gọi đổi tên với axis = 1. Bạn cũng có thể sử dụng phép gán hiểu danh sách có điều kiện.
cs95

Chỉ hoạt động với các kiểu dữ liệu thông thường dưới dạng tên cột, không phải nếu các cột của bạn là RangeIndex chẳng hạn df = pd.DataFrame([[1,2,3]]*10)-> df.columns, thì bạn sẽ sử dụngdf.add_suffix('_x')
Lorenz

bạn có thể làm df.columns = df.columns.astype(str) + '_x' như phương pháp đầu tiên của tôi cho thấy.
cs95

4

Tôi chưa thấy giải pháp này được đề xuất ở trên, vì vậy hãy thêm giải pháp này vào danh sách:

df.columns += '_x'

Và bạn có thể dễ dàng thích ứng với kịch bản tiền tố.


Giải pháp tốt nhất cho hậu tố, mặc dù nó không thể được sử dụng cho tiền tố tất nhiên.
Lorenz

Chỉ hoạt động với các kiểu dữ liệu thông thường trong tên cột, không phải nếu các cột của bạn là RangeIndex chẳng hạn như df = pd.DataFrame([[1,2,3]]*10)-> df.columns, thì bạn sẽ sử dụngdf.add_suffix('_x')
Lorenz

1

Tôi biết 4 cách để thêm hậu tố (hoặc tiền tố) vào tên cột của bạn:

1- df.columns = [str(col) + '_some_suffix' for col in df.columns]

hoặc là

2- df.rename(columns= lambda col: col+'_some_suffix')

hoặc là

3- df.columns += '_some_suffix'nhiều kỳ lạ.

hoặc đẹp nhất:

3- df.add_suffix('_some_suffix')


0

Đang sử dụng DataFrame.rename.

Ngừng sử dụng add_prefixadd_suffix

Trong các phiên bản gấu trúc trong tương lai add_prefixadd_suffixsẽ không được dùng nữa . Phương pháp mới được khuyên là sử dụng DataFrame.rename:

df = pd.DataFrame({'A': range(3), 'B': range(4, 7)})
print(df)
   A  B
0  0  4
1  1  5
2  2  6

Sử dụng định dạng renamevới axis=1và chuỗi:

df.rename('col_{}'.format, axis=1)
# or df.rename(columns='col_{}'.format)

   col_A  col_B
0      0      4
1      1      5
2      2      6

Để thực sự ghi đè lên tên cột của bạn, chúng tôi có thể gán các giá trị trả về cho df:

df = df.rename('col_{}'.format, axis=1)

hoặc sử dụng inplace=True:

df.rename('col_{}'.format, axis=1, inplace=True)
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.