Đổi tên cột trong gấu trúc


1826

Tôi có DataFrame bằng cách sử dụng gấu trúc và nhãn cột mà tôi cần chỉnh sửa để thay thế nhãn cột ban đầu.

Tôi muốn thay đổi tên cột trong DataFrame Atrong đó tên cột ban đầu là:

['$a', '$b', '$c', '$d', '$e'] 

đến

['a', 'b', 'c', 'd', 'e'].

Tôi có các tên cột đã chỉnh sửa được lưu trong danh sách, nhưng tôi không biết cách thay thế tên cột.


1
Bạn có thể muốn kiểm tra các tài liệu chính thức bao gồm việc đổi tên nhãn cột: pandas.pydata.org/pandas-docs/ sóng / user_guide / text.html
ccpizza

Câu trả lời:


1828

Chỉ cần gán nó cho .columnsthuộc tính:

>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
   a   b
0  1  10
1  2  20

303
Có thể thay đổi một tên tiêu đề cột duy nhất?
ericmjl

112
@ericmjl: giả sử bạn muốn thay đổi tên của biến đầu tiên của df. Sau đó, bạn có thể làm một cái gì đó như:new_columns = df.columns.values; new_columns[0] = 'XX'; df.columns = new_columns
cd98

54
Có vẻ như bạn có thể thực hiện đơn giản df.columns.values ​​[0] = 'XX'
RAY

25
Đùa thôi, @RAY - đừng làm thế. Có vẻ như đó là một danh sách được tạo độc lập với bất kỳ chỉ mục nào lưu trữ tên cột. Có một công việc tuyệt vời phá hủy việc đặt tên cột cho df của bạn ...
Mitch Flax

433
@ericmjl códf.rename(columns = {'$b':'B'}, inplace = True)
nachocab

2846

RENAME CỤ THỂ CỤ THỂ

Sử dụng df.rename()chức năng và giới thiệu các cột sẽ được đổi tên. Không phải tất cả các cột phải được đổi tên:

df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
# Or rename the existing DataFrame (rather than creating a copy) 
df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'}, inplace=True)

Ví dụ mã tối thiểu

df = pd.DataFrame('x', index=range(3), columns=list('abcde'))
df

   a  b  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Tất cả các phương pháp sau đây đều hoạt động và tạo ra cùng một đầu ra:

df2 = df.rename({'a': 'X', 'b': 'Y'}, axis=1)  # new method
df2 = df.rename({'a': 'X', 'b': 'Y'}, axis='columns')
df2 = df.rename(columns={'a': 'X', 'b': 'Y'})  # old method  

df2

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Hãy nhớ gán kết quả lại, vì sửa đổi là không đúng chỗ. Ngoài ra, chỉ định inplace=True:

df.rename({'a': 'X', 'b': 'Y'}, axis=1, inplace=True)
df

   X  Y  c  d  e
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Từ v0.25, bạn cũng có thể chỉ định errors='raise'tăng lỗi nếu chỉ định đổi tên cột không hợp lệ. Xem tài liệu v0.25rename() .


TIÊU ĐỀ CUNG CẤP

Sử dụng df.set_axis()với axis=1inplace=False(để trả lại một bản sao).

df2 = df.set_axis(['V', 'W', 'X', 'Y', 'Z'], axis=1, inplace=False)
df2

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

Điều này trả về một bản sao, nhưng bạn có thể sửa đổi DataFrame tại chỗ bằng cách cài đặt inplace=True(đây là hành vi mặc định cho các phiên bản <= 0,24 nhưng có thể sẽ thay đổi trong tương lai).

Bạn cũng có thể gán tiêu đề trực tiếp:

df.columns = ['V', 'W', 'X', 'Y', 'Z']
df

   V  W  X  Y  Z
0  x  x  x  x  x
1  x  x  x  x  x
2  x  x  x  x  x

2
khi tôi thực hiện việc này với khung dữ liệu 6 cột (khung dữ liệu <nhấn enter>) biểu diễn viết tắt: code<class 'pandas.core.frame.DataFrame'> Int64Index: 1000 mục, 0 đến 999 Cột dữ liệu: BodyMarkdown 1000 codetác phẩm không null , nhưng khi tôi làm dataframe.head () tên cũ cho các cột xuất hiện lại.
darKoram

12
Tôi cảm thấy sợ hãi SettingWithCopyWarning:khi tôi sử dụng đoạn mã thứ hai trong câu trả lời này.
Monica Heddneck

Có một phiên bản này với sự thay thế regex?
denfromufa

@lexual Nếu hai cột hiện có cùng tên thì sao? Làm thế nào để tôi đề cập đến tên cột cũ?
Vagabond

14
Giải pháp đầu tiên: df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})thay đổi tên được hiển thị, nhưng không phải là các thành phần trong cấu trúc dữ liệu cơ bản. Vì vậy, nếu bạn cố gắng, df['newName1']bạn sẽ nhận được một lỗi. Điều inplace=Truecần thiết là tránh gotchya đó.
cáu

402

Các renamephương pháp có thể mất một chức năng , ví dụ:

In [11]: df.columns
Out[11]: Index([u'$a', u'$b', u'$c', u'$d', u'$e'], dtype=object)

In [12]: df.rename(columns=lambda x: x[1:], inplace=True)

In [13]: df.columns
Out[13]: Index([u'a', u'b', u'c', u'd', u'e'], dtype=object)

56
Đẹp. Điều này đã cứu ngày của tôi:df.rename(columns=lambda x: x.lstrip(), inplace=True)
root-11

2
Tương tự như @ root-11 - trong trường hợp của tôi có một ký tự dấu đầu dòng không được in trong đầu ra của bảng điều khiển IPython, vì vậy tôi cần phải xóa nhiều hơn chỉ khoảng trắng (sọc), vì vậy:t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
Red Pea

9
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)là một viên ngọc quý để chúng ta có thể viết df.Column_1_Namethay vì viết df.loc[:, 'Column 1 Name'].
Bàn Bobby nhỏ


164

Gấu trúc 0,21+ Trả lời

Đã có một số cập nhật quan trọng để đổi tên cột trong phiên bản 0.21.

  • Các renamephương pháp đã được thêm vào các axistham số có thể được thiết lập để columnshoặc 1. Bản cập nhật này làm cho phương thức này khớp với phần còn lại của API gấu trúc. Nó vẫn có các tham số indexcolumnsnhưng bạn không còn bị buộc phải sử dụng chúng.
  • Các set_axisphương pháp với các inplacethiết lập để Falsecho phép bạn đổi tên tất cả các chỉ số hoặc cột nhãn với một danh sách.

Ví dụ cho Pandas 0,21+

Xây dựng DataFrame mẫu:

df = pd.DataFrame({'$a':[1,2], '$b': [3,4], 
                   '$c':[5,6], '$d':[7,8], 
                   '$e':[9,10]})

   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

Sử dụng renamevới axis='columns'hoặcaxis=1

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')

hoặc là

df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)

Cả hai kết quả sau:

   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

Vẫn có thể sử dụng chữ ký phương thức cũ:

df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})

Các renamechức năng cũng chấp nhận chức năng đó sẽ được áp dụng cho mỗi tên cột.

df.rename(lambda x: x[1:], axis='columns')

hoặc là

df.rename(lambda x: x[1:], axis=1)

Sử dụng set_axisvới một danh sách vàinplace=False

Bạn có thể cung cấp một danh sách cho set_axisphương thức có độ dài bằng với số cột (hoặc chỉ mục). Hiện tại, inplacemặc định là True, nhưng inplacesẽ được mặc định Falsetrong các bản phát hành trong tương lai.

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)

hoặc là

df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)

Tại sao không sử dụng df.columns = ['a', 'b', 'c', 'd', 'e']?

Không có gì sai khi gán các cột trực tiếp như thế này. Đó là một giải pháp hoàn toàn tốt.

Ưu điểm của việc sử dụng set_axislà nó có thể được sử dụng như một phần của chuỗi phương thức và nó trả về một bản sao mới của DataFrame. Nếu không có nó, bạn sẽ phải lưu các bước trung gian của chuỗi vào một biến khác trước khi gán lại các cột.

# new for pandas 0.21+
df.some_method1()
  .some_method2()
  .set_axis()
  .some_method3()

# old way
df1 = df.some_method1()
        .some_method2()
df1.columns = columns
df1.some_method3()

1
Cảm ơn bạn vì Pandas 0.21+ answer- bằng cách nào đó tôi đã bỏ lỡ phần đó trong phần "có gì mới" ...
MaxU

1
Giải pháp dường như không hiệu quả với Pandas 3.6: df.rename ({'$ a': 'a', '$ b': 'b', '$ c': 'c', '$ d': 'd ',' $ e ':' e '}, trục =' cột '). Nhận được một đối số từ khóa "trục" bất ngờ
Arthur D. Howland

3
df.columns = ['a', 'b', 'c', 'd', 'e'] dường như không hoạt động nữa, làm việc với phiên bản 0.22 Tôi có một cảnh báo nói rằng Pandas không cho phép các cột được tạo thông qua một tên thuộc tính mới . Làm cách nào để đổi tên nếu tất cả các cột của tôi được gọi giống nhau: /
Nabla

Có cách nào để đổi tên một, nhiều hoặc tất cả các cột, nếu bạn không biết tên của (các) cột trước mà chỉ là chỉ mục của chúng? Cảm ơn!
tommy.carstensen

đây là một bình luận rất hữu ích ví dụ, hàm lambda đã trả lời câu hỏi của tôi về cách thực hiện như sau:(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
đo lường chính xác

131

Vì bạn chỉ muốn xóa dấu $ trong tất cả các tên cột, bạn chỉ có thể làm:

df = df.rename(columns=lambda x: x.replace('$', ''))

HOẶC LÀ

df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

1
Điều này không chỉ giúp ích trong trường hợp của OP mà còn trong các yêu cầu chung. Ví dụ: để tách một tên cột bằng dấu phân cách và sử dụng một phần của nó.
Deepak


61
old_names = ['$a', '$b', '$c', '$d', '$e'] 
new_names = ['a', 'b', 'c', 'd', 'e']
df.rename(columns=dict(zip(old_names, new_names)), inplace=True)

Bằng cách này bạn có thể tự chỉnh sửa new_namestheo ý muốn. Hoạt động tuyệt vời khi bạn chỉ cần đổi tên một vài cột để sửa lỗi chính tả, dấu trọng âm, xóa các ký tự đặc biệt, v.v.


1
Tôi thích cách tiếp cận này, nhưng tôi nghĩ df.columns = ['a', 'b', 'c', 'd', 'e']đơn giản hơn.
Christopher Pearson

1
Tôi thích phương pháp này nén các tên cũ và mới. Chúng ta có thể sử dụng df.columns.valuesđể có được tên cũ.
bkowshik

1
Tôi hiển thị chế độ xem dạng bảng và sao chép các cột sang old_names. Tôi sao chép mảng yêu cầu sang new_names. Sau đó sử dụng dict (zip (old_names, new_names)) Giải pháp rất thanh lịch.
huyền thoại mã hóa

Tôi thường sử dụng tập hợp các danh sách từ một cái gì đó như : myList = list(df) myList[10:20], v.v. - vì vậy điều này là hoàn hảo.
Tim Gottgetreu

Tốt nhất nên lấy tên cũ như @bkowshik đề xuất, sau đó chỉnh sửa chúng và chèn lại chúng, tức là namez = df.columns.valuestheo sau là một số chỉnh sửa df.columns = namez.
pauljohn32

34

Giải pháp một dòng hoặc đường ống

Tôi sẽ tập trung vào hai điều:

  1. OP nêu rõ

    Tôi có các tên cột đã chỉnh sửa được lưu trong danh sách, nhưng tôi không biết cách thay thế tên cột.

    Tôi không muốn giải quyết vấn đề làm thế nào để thay thế '$'hoặc loại bỏ ký tự đầu tiên khỏi mỗi tiêu đề cột. OP đã thực hiện bước này. Thay vào đó tôi muốn tập trung vào việc thay thế columnsđối tượng hiện tại bằng một đối tượng mới được cung cấp một danh sách các tên cột thay thế.

  2. df.columns = newtrong đó newdanh sách các tên cột mới là đơn giản như nó được. Hạn chế của phương pháp này là nó yêu cầu chỉnh sửa columnsthuộc tính của khung dữ liệu hiện có và nó không được thực hiện nội tuyến. Tôi sẽ chỉ ra một vài cách để thực hiện điều này thông qua đường ống mà không cần chỉnh sửa khung dữ liệu hiện có.


Thiết lập 1
Để tập trung vào nhu cầu đổi tên tên cột thay thế bằng danh sách có sẵn, tôi sẽ tạo một khung dữ liệu mẫu mới dfvới tên cột ban đầu và tên cột mới không liên quan.

df = pd.DataFrame({'Jack': [1, 2], 'Mahesh': [3, 4], 'Xin': [5, 6]})
new = ['x098', 'y765', 'z432']

df

   Jack  Mahesh  Xin
0     1       3    5
1     2       4    6

Giải pháp 1
pd.DataFrame.rename

Người ta đã nói rằng nếu bạn có một từ điển ánh xạ các tên cột cũ thành các tên cột mới, bạn có thể sử dụng pd.DataFrame.rename.

d = {'Jack': 'x098', 'Mahesh': 'y765', 'Xin': 'z432'}
df.rename(columns=d)

   x098  y765  z432
0     1     3     5
1     2     4     6

Tuy nhiên, bạn có thể dễ dàng tạo từ điển đó và đưa nó vào cuộc gọi đến rename. Điều sau đây lợi dụng thực tế là khi lặp đi lặp lại df, chúng ta lặp lại qua từng tên cột.

# given just a list of new column names
df.rename(columns=dict(zip(df, new)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Điều này hoạt động tuyệt vời nếu tên cột ban đầu của bạn là duy nhất. Nhưng nếu họ không, thì điều này bị phá vỡ.


Thiết lập 2
cột không duy nhất

df = pd.DataFrame(
    [[1, 3, 5], [2, 4, 6]],
    columns=['Mahesh', 'Mahesh', 'Xin']
)
new = ['x098', 'y765', 'z432']

df

   Mahesh  Mahesh  Xin
0       1       3    5
1       2       4    6

Giải pháp 2
pd.concat sử dụng keysđối số

Đầu tiên, hãy chú ý những gì xảy ra khi chúng tôi cố gắng sử dụng giải pháp 1:

df.rename(columns=dict(zip(df, new)))

   y765  y765  z432
0     1     3     5
1     2     4     6

Chúng tôi đã không ánh xạ newdanh sách như các tên cột. Chúng tôi đã kết thúc lặp lại y765. Thay vào đó, chúng ta có thể sử dụng keysđối số của pd.concathàm trong khi lặp qua các cột của df.

pd.concat([c for _, c in df.items()], axis=1, keys=new) 

   x098  y765  z432
0     1     3     5
1     2     4     6

Giải pháp 3
Tái thiết. Điều này chỉ nên được sử dụng nếu bạn có một dtypecột cho tất cả các cột. Mặt khác, bạn sẽ kết thúc với dtype objecttất cả các cột và chuyển đổi chúng trở lại đòi hỏi nhiều công việc từ điển hơn.

Độc thân dtype

pd.DataFrame(df.values, df.index, new)

   x098  y765  z432
0     1     3     5
1     2     4     6

Trộn dtype

pd.DataFrame(df.values, df.index, new).astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Giải pháp 4
Đây là một mánh khóe phô trương với transposeset_index. pd.DataFrame.set_indexcho phép chúng ta thiết lập một chỉ mục nội tuyến nhưng không có tương ứng set_columns. Vì vậy, chúng ta có thể chuyển đổi, sau đó set_index, và chuyển đổi trở lại. Tuy nhiên, cùng một cảnh báo dtypeso với hỗn hợp dtypetừ giải pháp 3 áp dụng ở đây.

Độc thân dtype

df.T.set_index(np.asarray(new)).T

   x098  y765  z432
0     1     3     5
1     2     4     6

Trộn dtype

df.T.set_index(np.asarray(new)).T.astype(dict(zip(new, df.dtypes)))

   x098  y765  z432
0     1     3     5
1     2     4     6

Giải pháp 5
Sử dụng một lambdatrong pd.DataFrame.renameđó chu kỳ thông qua từng yếu tố của new
Trong giải pháp này, chúng tôi vượt qua một lambda mất xnhưng sau đó bỏ qua nó. Nó cũng mất một ynhưng không mong đợi nó. Thay vào đó, một trình vòng lặp được đưa ra như một giá trị mặc định và sau đó tôi có thể sử dụng nó để quay vòng qua một lần mà không cần quan tâm đến giá trị của xnó là gì.

df.rename(columns=lambda x, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

Và như được chỉ ra cho tôi bởi những người trong trò chuyện sopython , nếu tôi thêm một *ở giữa xy, tôi có thể bảo vệ ybiến của mình . Mặc dù, trong bối cảnh này, tôi không tin rằng nó cần được bảo vệ. Nó vẫn còn đáng nói.

df.rename(columns=lambda x, *, y=iter(new): next(y))

   x098  y765  z432
0     1     3     5
1     2     4     6

Có lẽ chúng ta có thể thêmdf.rename(lambda x : x.lstrip('$'),axis=1)
YOBEN_S

Xin chào @piRSquared, bạn có thể giải thích cách gấu trúc sử dụng chức năng lambda trong Giải pháp 5 không? Tôi không hoàn toàn làm theo những gì bạn muốn nói khi bạn nói xbị bỏ qua?
Josmoor98

33

Tên cột so với Tên của Sê-ri

Tôi muốn giải thích một chút những gì xảy ra đằng sau hậu trường.

Dataframes là một bộ Series.

Lần lượt là một phần mở rộng của một numpy.array

numpy.arrays có một tài sản .name

Đây là tên của bộ truyện. Rất hiếm khi gấu trúc tôn trọng thuộc tính này, nhưng nó tồn tại ở những nơi và có thể được sử dụng để hack một số hành vi của gấu trúc.

Đặt tên cho danh sách các cột

Rất nhiều câu trả lời ở đây nói về df.columnsthuộc tính listkhi thực tế nó là một Series. Điều này có nghĩa là nó có một .namethuộc tính.

Đây là những gì xảy ra nếu bạn quyết định điền vào tên của các cột Series:

df.columns = ['column_one', 'column_two']
df.columns.names = ['name of the list of columns']
df.index.names = ['name of the index']

name of the list of columns     column_one  column_two
name of the index       
0                                    4           1
1                                    5           2
2                                    6           3

Lưu ý rằng tên của chỉ mục luôn thấp hơn một cột.

Cổ vật nán lại

Các .namethuộc tính kéo dài đôi khi. Nếu bạn đặt df.columns = ['one', 'two']thì df.one.namesẽ được 'one'.

Nếu bạn đặt df.one.name = 'three'thì df.columnsvẫn sẽ cho bạn ['one', 'two'], và df.one.namesẽ cho bạn'three'

NHƯNG

pd.DataFrame(df.one) sẽ trở lại

    three
0       1
1       2
2       3

Bởi vì gấu trúc tái sử dụng .namecái đã được xác định Series.

Tên cột đa cấp

Gấu trúc có cách làm tên cột nhiều lớp. Không có quá nhiều phép thuật liên quan nhưng tôi cũng muốn đề cập đến câu trả lời này vì tôi không thấy ai nhặt được thứ này ở đây.

    |one            |
    |one      |two  |
0   |  4      |  1  |
1   |  5      |  2  |
2   |  6      |  3  |

Điều này có thể dễ dàng đạt được bằng cách đặt các cột thành danh sách, như thế này:

df.columns = [['one', 'one'], ['one', 'two']]

18

Nếu bạn đã có khung dữ liệu, df.column sẽ bỏ mọi thứ vào một danh sách mà bạn có thể thao tác và sau đó gán lại vào khung dữ liệu của bạn dưới dạng tên của các cột ...

columns = df.columns
columns = [row.replace("$","") for row in columns]
df.rename(columns=dict(zip(columns, things)), inplace=True)
df.head() #to validate the output

Cách tốt nhất? IDK. Một cách - có.

Một cách tốt hơn để đánh giá tất cả các kỹ thuật chính được đưa ra trong các câu trả lời cho câu hỏi dưới đây là sử dụng cProfile để đo thời gian thực hiện bộ nhớ và thời gian thực hiện. @kadee, @kaitlyn, & @eumiro có các chức năng với thời gian thực hiện nhanh nhất - mặc dù các chức năng này rất nhanh, chúng tôi đang so sánh làm tròn 0,000 và 0,001 giây cho tất cả các câu trả lời. Về mặt đạo đức: câu trả lời của tôi ở trên có thể không phải là cách 'Tốt nhất'.

import pandas as pd
import cProfile, pstats, re

old_names = ['$a', '$b', '$c', '$d', '$e']
new_names = ['a', 'b', 'c', 'd', 'e']
col_dict = {'$a': 'a', '$b': 'b','$c':'c','$d':'d','$e':'e'}

df = pd.DataFrame({'$a':[1,2], '$b': [10,20],'$c':['bleep','blorp'],'$d':[1,2],'$e':['texa$','']})

df.head()

def eumiro(df,nn):
    df.columns = nn
    #This direct renaming approach is duplicated in methodology in several other answers: 
    return df

def lexual1(df):
    return df.rename(columns=col_dict)

def lexual2(df,col_dict):
    return df.rename(columns=col_dict, inplace=True)

def Panda_Master_Hayden(df):
    return df.rename(columns=lambda x: x[1:], inplace=True)

def paulo1(df):
    return df.rename(columns=lambda x: x.replace('$', ''))

def paulo2(df):
    return df.rename(columns=lambda x: x.replace('$', ''), inplace=True)

def migloo(df,on,nn):
    return df.rename(columns=dict(zip(on, nn)), inplace=True)

def kadee(df):
    return df.columns.str.replace('$','')

def awo(df):
    columns = df.columns
    columns = [row.replace("$","") for row in columns]
    return df.rename(columns=dict(zip(columns, '')), inplace=True)

def kaitlyn(df):
    df.columns = [col.strip('$') for col in df.columns]
    return df

print 'eumiro'
cProfile.run('eumiro(df,new_names)')
print 'lexual1'
cProfile.run('lexual1(df)')
print 'lexual2'
cProfile.run('lexual2(df,col_dict)')
print 'andy hayden'
cProfile.run('Panda_Master_Hayden(df)')
print 'paulo1'
cProfile.run('paulo1(df)')
print 'paulo2'
cProfile.run('paulo2(df)')
print 'migloo'
cProfile.run('migloo(df,old_names,new_names)')
print 'kadee'
cProfile.run('kadee(df)')
print 'awo'
cProfile.run('awo(df)')
print 'kaitlyn'
cProfile.run('kaitlyn(df)')

Tại sao bạn cần đổi tên phương thức? Một cái gì đó như thế này làm việc cho tôi # df.columns = [row.replace ( '$', '') cho hàng trong df.columns]
shantanuo

Tôi không hiểu phần 'mọi thứ'. Tôi phải thay thế cái gì? Những cột cũ?
Andrea Ianni ௫

18

Hãy nói rằng đây là khung dữ liệu của bạn.

nhập mô tả hình ảnh ở đây

Bạn có thể đổi tên các cột bằng hai phương thức.

  1. Sử dụng dataframe.columns=[#list]

    df.columns=['a','b','c','d','e']

    nhập mô tả hình ảnh ở đây

    Hạn chế của phương pháp này là nếu một cột phải được thay đổi, danh sách cột đầy đủ phải được thông qua. Ngoài ra, phương pháp này không áp dụng trên nhãn chỉ mục. Ví dụ: nếu bạn đã vượt qua điều này:

    df.columns = ['a','b','c','d']

    Điều này sẽ ném một lỗi. Độ dài không khớp: Trục dự kiến ​​có 5 phần tử, giá trị mới có 4 phần tử.

  2. Một phương thức khác là phương thức Pandas rename()được sử dụng để đổi tên bất kỳ chỉ mục, cột hoặc hàng nào

    df = df.rename(columns={'$a':'a'})

    nhập mô tả hình ảnh ở đây

Tương tự, bạn có thể thay đổi bất kỳ hàng hoặc cột.


17
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})

Nếu danh sách cột mới của bạn theo cùng thứ tự với các cột hiện có, việc gán đơn giản:

new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
   a  b  c  d  e
0  1  1  1  1  1

Nếu bạn có một từ điển được khóa trên tên cột cũ thành tên cột mới, bạn có thể làm như sau:

d = {'$a': 'a', '$b': 'b', '$c': 'c', '$d': 'd', '$e': 'e'}
df.columns = df.columns.map(lambda col: d[col])  # Or `.map(d.get)` as pointed out by @PiRSquared.
>>> df
   a  b  c  d  e
0  1  1  1  1  1

Nếu bạn không có danh sách hoặc ánh xạ từ điển, bạn có thể loại bỏ $biểu tượng hàng đầu thông qua việc hiểu danh sách:

df.columns = [col[1:] if col[0] == '$' else col for col in df]

2
Thay vì lambda col: d[col]bạn có thể vượt qua d.get... vì vậy nó sẽ trông như thếdf.columns.map(d.get)
piRSquared


15

Hãy hiểu đổi tên bằng một ví dụ nhỏ ...

1.Renaming cột sử dụng ánh xạ:

df = pd.DataFrame({"A": [1, 2, 3], "B": [4, 5, 6]}) #creating a df with column name A and B
df.rename({"A": "new_a", "B": "new_b"},axis='columns',inplace =True) #renaming column A with 'new_a' and B with 'new_b'

output:
   new_a  new_b
0  1       4
1  2       5
2  3       6

2.Renaming index / Row_Name bằng cách sử dụng ánh xạ:

df.rename({0: "x", 1: "y", 2: "z"},axis='index',inplace =True) #Row name are getting replaced by 'x','y','z'.

output:
       new_a  new_b
    x  1       4
    y  2       5
    z  3       6

Câu trả lời được đánh giá cao nhất đã có những ví dụ như vậy ...
Itamar Mushkin

14

Một cách khác để chúng ta có thể thay thế các nhãn cột ban đầu là bằng cách tước các ký tự không mong muốn (ở đây '$') khỏi các nhãn cột ban đầu.

Điều này có thể đã được thực hiện bằng cách chạy một vòng lặp for trên df.column và nối thêm các cột bị tước vào df.columns.

Thay vào đó, chúng ta có thể thực hiện điều này một cách gọn gàng trong một tuyên bố bằng cách sử dụng khả năng hiểu danh sách như dưới đây:

df.columns = [col.strip('$') for col in df.columns]

( stripphương thức trong Python loại bỏ ký tự đã cho từ đầu và cuối chuỗi.)


2
Bạn có thể giải thích làm thế nào / tại sao điều này làm việc? Điều đó sẽ làm cho câu trả lời có giá trị hơn cho độc giả trong tương lai.
Dan Lowe

12

Thực sự đơn giản chỉ cần sử dụng

df.columns = ['Name1', 'Name2', 'Name3'...]

và nó sẽ gán tên cột theo thứ tự bạn đặt chúng


10

Bạn có thể sử dụng str.slicecho điều đó:

df.columns = df.columns.str.slice(1)

1
PS: Đây là một chi tiết dài hơn tương đương với df.columns.str[1:]... có lẽ tốt hơn để sử dụng nó, nó ngắn hơn và rõ ràng hơn.
cs95

9

Tôi biết câu hỏi và câu trả lời này đã bị nhai cho đến chết. Nhưng tôi đã đề cập đến nó để truyền cảm hứng cho một trong những vấn đề tôi đang gặp phải. Tôi đã có thể giải quyết nó bằng cách sử dụng các bit và các mảnh từ các câu trả lời khác nhau do đó cung cấp phản hồi của tôi trong trường hợp bất cứ ai cần nó.

Phương pháp của tôi là chung trong đó bạn có thể thêm các dấu phân cách bổ sung bằng cách phân tách dấu phẩy delimiters=và chứng minh tương lai.

Mã làm việc:

import pandas as pd
import re


df = pd.DataFrame({'$a':[1,2], '$b': [3,4],'$c':[5,6], '$d': [7,8], '$e': [9,10]})

delimiters = '$'
matchPattern = '|'.join(map(re.escape, delimiters))
df.columns = [re.split(matchPattern, i)[1] for i in df.columns ]

Đầu ra:

>>> df
   $a  $b  $c  $d  $e
0   1   3   5   7   9
1   2   4   6   8  10

>>> df
   a  b  c  d   e
0  1  3  5  7   9
1  2  4  6  8  10

8

Lưu ý rằng các phương pháp này không hoạt động đối với Đa chỉ số. Đối với Đa chỉ số, bạn cần thực hiện một số thao tác như sau:

>>> df = pd.DataFrame({('$a','$x'):[1,2], ('$b','$y'): [3,4], ('e','f'):[5,6]})
>>> df
   $a $b  e
   $x $y  f
0  1  3  5
1  2  4  6
>>> rename = {('$a','$x'):('a','x'), ('$b','$y'):('b','y')}
>>> df.columns = pandas.MultiIndex.from_tuples([
        rename.get(item, item) for item in df.columns.tolist()])
>>> df
   a  b  e
   x  y  f
0  1  3  5
1  2  4  6

8

Một tùy chọn khác là đổi tên bằng biểu thức chính quy:

import pandas as pd
import re

df = pd.DataFrame({'$a':[1,2], '$b':[3,4], '$c':[5,6]})

df = df.rename(columns=lambda x: re.sub('\$','',x))
>>> df
   a  b  c
0  1  3  5
1  2  4  6

6

Nếu bạn phải đối phó với vô số cột được đặt tên bởi hệ thống cung cấp ngoài tầm kiểm soát của bạn, tôi đã đưa ra cách tiếp cận sau đây là sự kết hợp giữa cách tiếp cận chung và thay thế cụ thể trong một lần.

Trước tiên, hãy tạo một từ điển từ các tên cột của khung dữ liệu bằng cách sử dụng các biểu thức regex để loại bỏ các phụ lục nhất định của các tên cột và sau đó thêm các thay thế cụ thể vào từ điển để đặt tên cho các cột lõi như dự kiến ​​sau này trong cơ sở dữ liệu nhận.

Điều này sau đó được áp dụng cho khung dữ liệu trong một lần.

dict=dict(zip(df.columns,df.columns.str.replace('(:S$|:C1$|:L$|:D$|\.Serial:L$)','')))
dict['brand_timeseries:C1']='BTS'
dict['respid:L']='RespID'
dict['country:C1']='CountryID'
dict['pim1:D']='pim_actual'
df.rename(columns=dict, inplace=True)

5

Ngoài giải pháp đã được cung cấp, bạn có thể thay thế tất cả các cột trong khi bạn đang đọc tệp. Chúng ta có thể sử dụng namesheader=0 để làm điều đó.

Đầu tiên, chúng tôi tạo một danh sách các tên mà chúng tôi muốn sử dụng làm tên cột của chúng tôi:

import pandas as pd

ufo_cols = ['city', 'color reported', 'shape reported', 'state', 'time']
ufo.columns = ufo_cols

ufo = pd.read_csv('link to the file you are using', names = ufo_cols, header = 0)

Trong trường hợp này, tất cả các tên cột sẽ được thay thế bằng các tên bạn có trong danh sách của bạn.


4

Đây là một chức năng nhỏ tiện lợi mà tôi muốn sử dụng để cắt giảm việc gõ:

def rename(data, oldnames, newname): 
    if type(oldnames) == str: #input can be a string or list of strings 
        oldnames = [oldnames] #when renaming multiple columns 
        newname = [newname] #make sure you pass the corresponding list of new names
    i = 0 
    for name in oldnames:
        oldvar = [c for c in data.columns if name in c]
        if len(oldvar) == 0: 
            raise ValueError("Sorry, couldn't find that column in the dataset")
        if len(oldvar) > 1: #doesn't have to be an exact match 
            print("Found multiple columns that matched " + str(name) + " :")
            for c in oldvar:
                print(str(oldvar.index(c)) + ": " + str(c))
            ind = input('please enter the index of the column you would like to rename: ')
            oldvar = oldvar[int(ind)]
        if len(oldvar) == 1:
            oldvar = oldvar[0]
        data = data.rename(columns = {oldvar : newname[i]})
        i += 1 
    return data   

Dưới đây là một ví dụ về cách thức hoạt động của nó:

In [2]: df = pd.DataFrame(np.random.randint(0,10,size=(10, 4)), columns=['col1','col2','omg','idk'])
#first list = existing variables
#second list = new names for those variables
In [3]: df = rename(df, ['col','omg'],['first','ohmy']) 
Found multiple columns that matched col :
0: col1
1: col2

please enter the index of the column you would like to rename: 0

In [4]: df.columns
Out[5]: Index(['first', 'col2', 'ohmy', 'idk'], dtype='object')

1
Trường hợp sử dụng cho một chức năng như thế này là cực kỳ hiếm. Trong hầu hết các trường hợp, tôi biết những gì tôi đang tìm kiếm và những gì tôi muốn đổi tên thành, tôi chỉ tự mình gán / sửa đổi nó.
cs95

1
@ cs95 Tôi có xu hướng làm việc với các khảo sát quốc gia hoặc quốc tế lớn, nơi các biến sẽ có tên biến được mã hóa bắt đầu bằng tiền tố tùy thuộc vào tùy chọn trả lời, thang đo độ chính xác và phân nhánh (như EDU_2913.443, EDU_2913.421, ...). Chức năng này rất hữu ích cho tôi khi làm việc với các loại bộ đó, tôi hiểu nếu nó không dành cho bạn :)
seeiespi

4

Đổi tên cột trong gấu trúc là một nhiệm vụ dễ dàng.

df.rename(columns = {'$a':'a','$b':'b','$c':'c','$d':'d','$e':'e'},inplace = True)

2

Giả sử bạn có thể sử dụng biểu thức chính quy. Giải pháp này loại bỏ nhu cầu mã hóa thủ công bằng regex

import pandas as pd
import re

srch=re.compile(r"\w+")

data=pd.read_csv("CSV_FILE.csv")
cols=data.columns
new_cols=list(map(lambda v:v.group(),(list(map(srch.search,cols)))))
data.columns=new_cols

2
Đó là cách thực hành tốt trên Stack Overflow để thêm một lời giải thích về lý do tại sao giải pháp của bạn nên hoạt động hoặc tốt hơn các giải pháp hiện có. Để biết thêm thông tin đọc Làm thế nào để trả lời .
Samuel Liew

Lưu ý cách câu trả lời được đánh giá tốt nhất yêu cầu một số hình thức mã hóa cứng và câu trả lời được đánh giá tệ nhất chỉ yêu cầu phương pháp mô tả và thủ tục?
Kaustubh J

Có những giải pháp tốt hơn (dễ đọc hơn) cũng sử dụng regex hơn thế này. Đây là cách làm nhiều hơn so với hoạt động đổi tên đơn giản. Ngoài ra còn có nguy cơ mẫu không khớp với bất cứ điều gì trong trường hợp bạn chưa làm gì để xử lý lỗi.
cs95
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.