라는 데이터 프레임이 data
있습니다. 열 헤더를 하나만 바꾸려면 어떻게해야합니까? 예를 들어, gdp
에 log(gdp)
?
data =
y gdp cap
0 1 2 5
1 2 3 9
2 8 7 2
3 3 4 7
4 6 7 7
5 4 8 3
6 8 2 8
7 9 9 10
8 6 6 4
9 10 10 7
답변
data.rename(columns={'gdp':'log(gdp)'}, inplace=True)
rename
이의 PARAM로 DICT 받아들이는 쇼 columns
당신은 단지 하나의 항목으로 DICT을 통과 할 수 있도록합니다.
관련 참조
답변
list-comprehension
단일 열의 이름을 바꾸어야 할 경우 훨씬 빠른 구현이 사용 됩니다.
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
여러 열의 이름을 바꾸어야 할 경우 다음과 같은 조건식을 사용하십시오.
df.columns = ['log(gdp)' if x=='gdp' else 'cap_mod' if x=='cap' else x for x in df.columns]
또는,를 사용하여 매핑을 구성 dictionary
하고 수행 list-comprehension
그것의에 get
이전 이름으로 기본 값을 설정하여 운영 :
col_dict = {'gdp': 'log(gdp)', 'cap': 'cap_mod'} ## key→old name, value→new name
df.columns = [col_dict.get(x, x) for x in df.columns]
타이밍 :
%%timeit
df.rename(columns={'gdp':'log(gdp)'}, inplace=True)
10000 loops, best of 3: 168 µs per loop
%%timeit
df.columns = ['log(gdp)' if x=='gdp' else x for x in df.columns]
10000 loops, best of 3: 58.5 µs per loop
답변
팬더에서 특정 열의 이름을 바꾸려면 어떻게합니까?
v0.24 이상에서 한 번에 하나 이상의 열 이름을 바꾸려면
-
DataFrame.rename()
withaxis=1
또는axis='columns'
(axis
논쟁은에서 소개되었습니다v0.21
. -
Index.str.replace()
문자열 / 정규식 기반 교체 용.
한 번에 모든 열의 이름을 바꾸어야하는 경우
DataFrame.set_axis()
와 방법axis=1
. 목록과 같은 순서를 전달하십시오. 전체 수정 옵션도 제공됩니다.
rename
와 axis=1
df = pd.DataFrame('x', columns=['y', 'gdp', 'cap'], index=range(5))
df
y gdp cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
0.21+에서는 다음을 사용하여 axis
매개 변수를 지정할 수 있습니다 rename
.
df.rename({'gdp':'log(gdp)'}, axis=1)
# df.rename({'gdp':'log(gdp)'}, axis='columns')
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
( rename
기본적으로 제자리에 있지 않으므로 결과를 다시 할당 해야합니다 .)
이 기능은 나머지 API와의 일관성을 향상시키기 위해 추가되었습니다. 새로운 axis
인수는 columns
매개 변수와 유사 하며 동일한 작업을 수행합니다.
df.rename(columns={'gdp': 'log(gdp)'})
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
rename
또한 각 열에 대해 한 번 호출되는 콜백을 허용합니다.
df.rename(lambda x: x[0], axis=1)
# df.rename(lambda x: x[0], axis='columns')
y g c
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
이 특정 시나리오의 경우
df.rename(lambda x: 'log(gdp)' if x == 'gdp' else x, axis=1)
Index.str.replace
replace
파이썬의 문자열 방법과 유사하게 , pandas Index and Series (객체 dtype 만) str.replace
는 문자열 및 정규식 기반 대체를위한 ( “벡터화 된”) 방법을 정의합니다 .
df.columns = df.columns.str.replace('gdp', 'log(gdp)')
df
y log(gdp) cap
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
다른 방법에 str.replace
비해이 방법의 장점 은 정규식 (기본적으로 활성화 됨) 을 지원 한다는 것 입니다. 자세한 내용은 문서를 참조하십시오.
에 목록을 전달 set_axis
과axis=1
set_axis
헤더 목록으로 전화하십시오 . 목록의 길이는 열 / 색인 크기와 같아야합니다. set_axis
기본적으로 원본 DataFrame을 변경하지만 inplace=False
수정 된 복사본을 반환하도록 지정할 수 있습니다 .
df.set_axis(['cap', 'log(gdp)', 'y'], axis=1, inplace=False)
# df.set_axis(['cap', 'log(gdp)', 'y'], axis='columns', inplace=False)
cap log(gdp) y
0 x x x
1 x x x
2 x x x
3 x x x
4 x x x
참고 : 이후 릴리스에서는 inplace
기본값이로 설정됩니다 True
.
Method Chaining
왜 ? set_axis
를 사용하여 열을 효율적으로 할당 할 수있는 방법을 선택 해야 df.columns = ...
합니까? [이 답변]에서 Ted Petrou가 보여준 것처럼 ( https://stackoverflow.com/a/46912050/4909087 ) set_axis
은 메소드를 연결하려고 할 때 유용합니다.
비교
# 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()
전자는 더 자연스럽고 자유롭게 흐르는 구문입니다.
답변
팬더에서 특정 열의 이름을 바꾸는 방법에는 적어도 5 가지가 있으며 원래 답변에 대한 링크와 함께 아래에 나열했습니다. 또한이 방법의 시간을 정하고 데이터 세트와 시나리오에 따라 YMMV가 거의 동일하게 수행되는 것으로 나타났습니다. 아래의 테스트 케이스는 열 이름을 변경하는 것입니다 A
M
N
Z
에 A2
M2
N2
Z2
열이있는 dataframe에 A
에 Z
백만 행을 포함.
# Import required modules
import numpy as np
import pandas as pd
import timeit
# Create sample data
df = pd.DataFrame(np.random.randint(0,9999,size=(1000000, 26)), columns=list('ABCDEFGHIJKLMNOPQRSTUVWXYZ'))
# Standard way - https://stackoverflow.com/a/19758398/452587
def method_1():
df_renamed = df.rename(columns={'A': 'A2', 'M': 'M2', 'N': 'N2', 'Z': 'Z2'})
# Lambda function - https://stackoverflow.com/a/16770353/452587
def method_2():
df_renamed = df.rename(columns=lambda x: x + '2' if x in ['A', 'M', 'N', 'Z'] else x)
# Mapping function - https://stackoverflow.com/a/19758398/452587
def rename_some(x):
if x=='A' or x=='M' or x=='N' or x=='Z':
return x + '2'
return x
def method_3():
df_renamed = df.rename(columns=rename_some)
# Dictionary comprehension - https://stackoverflow.com/a/58143182/452587
def method_4():
df_renamed = df.rename(columns={col: col + '2' for col in df.columns[
np.asarray([i for i, col in enumerate(df.columns) if 'A' in col or 'M' in col or 'N' in col or 'Z' in col])
]})
# Dictionary comprehension - https://stackoverflow.com/a/38101084/452587
def method_5():
df_renamed = df.rename(columns=dict(zip(df[['A', 'M', 'N', 'Z']], ['A2', 'M2', 'N2', 'Z2'])))
print('Method 1:', timeit.timeit(method_1, number=10))
print('Method 2:', timeit.timeit(method_2, number=10))
print('Method 3:', timeit.timeit(method_3, number=10))
print('Method 4:', timeit.timeit(method_4, number=10))
print('Method 5:', timeit.timeit(method_5, number=10))
산출:
Method 1: 3.650640267
Method 2: 3.163998427
Method 3: 2.998530871
Method 4: 2.9918436889999995
Method 5: 3.2436501520000007
가장 직관적이고 응용 프로그램에서 가장 쉽게 구현할 수있는 방법을 사용하십시오.
답변
