팬더와 열 레이블을 사용하는 DataFrame이 있는데 원래 열 레이블을 바꾸려면 편집해야합니다.
A
원래 열 이름이 다음 과 같은 DataFrame 에서 열 이름을 변경하고 싶습니다 .
['$a', '$b', '$c', '$d', '$e']
에
['a', 'b', 'c', 'd', 'e'].
편집 한 열 이름을 목록에 저장했지만 열 이름을 바꾸는 방법을 모르겠습니다.
팬더와 열 레이블을 사용하는 DataFrame이 있는데 원래 열 레이블을 바꾸려면 편집해야합니다.
A
원래 열 이름이 다음 과 같은 DataFrame 에서 열 이름을 변경하고 싶습니다 .
['$a', '$b', '$c', '$d', '$e']
에
['a', 'b', 'c', 'd', 'e'].
편집 한 열 이름을 목록에 저장했지만 열 이름을 바꾸는 방법을 모르겠습니다.
답변:
.columns
속성에 지정하십시오 .
>>> df = pd.DataFrame({'$a':[1,2], '$b': [10,20]})
>>> df.columns = ['a', 'b']
>>> df
a b
0 1 10
1 2 20
new_columns = df.columns.values;
new_columns[0] = 'XX';
df.columns = new_columns
df.rename(columns = {'$b':'B'}, inplace = True)
df.rename()
함수를 사용하고 이름을 바꿀 열을 참조하십시오. 모든 열의 이름을 바꿀 필요는 없습니다.
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)
최소 코드 예
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
다음 방법은 모두 작동하며 동일한 출력을 생성합니다.
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
수정이 제자리에 있지 않으므로 결과를 다시 할당해야합니다. 또는 다음을 지정하십시오 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
v0.25부터 errors='raise'
유효하지 않은 열 이름 바꾸기가 지정된 경우 오류를 발생 시키도록 지정할 수도 있습니다 . v0.25 rename()
문서를 참조하십시오 .
사용 df.set_axis()
과 axis=1
과 inplace=False
(사본을 반환).
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
이렇게하면 복사본이 반환되지만 설정을 통해 DataFrame을 내부에서 수정할 수 있습니다 inplace=True
(버전 <= 0.24의 기본 동작이지만 향후 변경 될 수 있음).
헤더를 직접 할당 할 수도 있습니다.
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
code
<클래스 'pandas.core.frame.DataFrame'> Int64Index 1000 개 항목 0-999 데이터 열 : BodyMarkdown 1,000 비 - 널 code
작품 하지만 dataframe.head ()를 수행하면 열의 이전 이름이 다시 나타납니다.
SettingWithCopyWarning:
이 답변에서 두 번째 코드 스 니펫을 사용 하면 두려워 합니다.
df = df.rename(columns={'oldName1': 'newName1', 'oldName2': 'newName2'})
표시된 이름을 변경하지만 기본 데이터 구조의 요소는 변경 하지 않습니다 . 따라서 시도 df['newName1']
하면 오류가 발생합니다. 는 inplace=True
그 gotchya를 방지하는 것이 필요하다.
이 rename
메소드는 다음과 같은 함수를 사용할 수 있습니다 .
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)
df.rename(columns=lambda x: x.lstrip(), inplace=True)
t.columns = t.columns.str.replace(r'[^\x00-\x7F]+','')
df.rename(columns=lambda x: x.replace(' ', '_'), inplace=True)
우리가 쓰는 df.Column_1_Name
대신 쓸 수 있도록 보석 df.loc[:, 'Column 1 Name']
입니다.
텍스트 데이터 작업에 설명 된대로 :
df.columns = df.columns.str.replace('$','')
버전 0.21의 컬럼 이름 변경에 대한 중요한 업데이트가 있습니다.
rename
방법 은 axis
매개 변수를 추가 했습니다.columns
또는1
. 이 업데이트는이 메소드가 나머지 팬더 API와 일치하도록합니다. 그것은 여전히 가지고 index
와columns
매개 변수가 있지만 더 이상 사용하지 않아도됩니다.set_axis
방법 와 inplace
세트에 False
당신이 목록의 모든 인덱스 또는 열 레이블의 이름을 변경 할 수 있습니다.샘플 DataFrame을 생성하십시오.
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
rename
으로 axis='columns'
또는axis=1
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis='columns')
또는
df.rename({'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'}, axis=1)
두 가지 모두 결과는 다음과 같습니다.
a b c d e
0 1 3 5 7 9
1 2 4 6 8 10
이전 메소드 서명을 계속 사용할 수 있습니다.
df.rename(columns={'$a':'a', '$b':'b', '$c':'c', '$d':'d', '$e':'e'})
이 rename
함수는 각 열 이름에 적용될 함수도 허용합니다.
df.rename(lambda x: x[1:], axis='columns')
또는
df.rename(lambda x: x[1:], axis=1)
set_axis
목록과 함께inplace=False
set_axis
열 수 (또는 인덱스)와 길이가 같은 메소드에 목록을 제공 할 수 있습니다 . 현재 inplace
기본값은 True
이지만 이후 릴리스에서는 inplace
기본값이 False
됩니다.
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis='columns', inplace=False)
또는
df.set_axis(['a', 'b', 'c', 'd', 'e'], axis=1, inplace=False)
df.columns = ['a', 'b', 'c', 'd', 'e']
않습니까?이와 같이 열을 직접 할당하는 데 아무런 문제가 없습니다. 완벽하게 좋은 솔루션입니다.
사용의 이점은 set_axis
메소드 체인의 일부로 사용될 수 있으며 DataFrame의 새 사본을 리턴한다는 것입니다. 이것이 없으면 열을 다시 할당하기 전에 체인의 중간 단계를 다른 변수에 저장해야합니다.
# 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()
Pandas 0.21+ answer
-어떻게 든 "새로운 기능"부분에서 그 부분을 놓쳤습니다.
(df .groupby(['page',pd.Grouper(key='date',freq='MS')])['clicks'].sum() .unstack(1) .rename(lambda x: x.strftime("%Y-%m"), axis='columns') )
모든 열 이름에서 $ 기호 만 제거하려고하므로 다음과 같이하면됩니다.
df = df.rename(columns=lambda x: x.replace('$', ''))
또는
df.rename(columns=lambda x: x.replace('$', ''), inplace=True)
df.columns = ['a', 'b', 'c', 'd', 'e']
기존 이름은 입력 한 순서대로 제공 한 이름으로 바뀝니다.
df.columns.values
. stackoverflow.com/questions/43291781/…
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)
이 방법으로 new_names
원하는대로 수동으로 편집 할 수 있습니다 . 잘못된 철자, 악센트, 특수 문자 등을 제거하기 위해 몇 개의 열만 이름을 바꾸어야 할 때 효과적입니다.
df.columns = ['a', 'b', 'c', 'd', 'e']
더 간단 하다고 생각 합니다.
df.columns.values
이전 이름을 얻는 데 사용할 수 있습니다 .
myList = list(df) myList[10:20]
하므로 완벽합니다.
namez = df.columns.values
한 후, 일부 편집 다음 df.columns = namez
.
두 가지에 중점을 둘 것입니다.
OP는 명확하게 말한다
편집 한 열 이름을 목록에 저장했지만 열 이름을 바꾸는 방법을 모르겠습니다.
'$'
각 열 머리글에서 첫 번째 문자 를 바꾸 거나 제거하는 방법의 문제를 해결하고 싶지 않습니다 . OP는 이미이 단계를 수행했습니다. 대신 기존 columns
개체를 대체 열 이름 목록이 지정된 새 개체로 바꾸는 데 집중하고 싶습니다 .
df.columns = new
new
새 열 이름의 목록은 어디서나 간단합니다. 이 방법의 단점은 기존 데이터 프레임의 columns
속성을 편집해야하며 인라인으로 수행되지 않는다는 것입니다. 기존 데이터 프레임을 편집하지 않고 파이프 라이닝을 통해이를 수행하는 몇 가지 방법을 보여 드리겠습니다.
설정 1
기존 열 목록으로 바꾸기 열 이름의 이름을 바꾸어야하는 필요성에 초점을 맞추기 위해 df
초기 열 이름과 관련이없는 새 열 이름을 사용하여 새 샘플 데이터 프레임 을 만듭니다 .
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
해결책 1
pd.DataFrame.rename
이미 이전 열 이름을 새 열 이름에 매핑하는 사전 이 있다면 사용할 수 있다고합니다 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
그러나 해당 사전을 쉽게 만들고에 대한 호출에 포함 할 수 있습니다 rename
. 다음은 반복 할 때 df
각 열 이름을 반복 한다는 사실을 활용합니다 .
# 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
원래 열 이름이 고유 한 경우 효과적입니다. 그러나 그들이 그렇지 않다면, 이것은 무너집니다.
고유하지 않은 열 2 개 설정
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
해결 방법 2
pd.concat
사용keys
인수
먼저 솔루션 1을 사용하려고 할 때 어떤 일이 발생하는지 확인하십시오.
df.rename(columns=dict(zip(df, new)))
y765 y765 z432
0 1 3 5
1 2 4 6
new
리스트를 열 이름으로 맵핑하지 않았습니다 . 우리는 반복했다 y765
. 대신 의 열을 반복하면서 함수 의 keys
인수를 사용할 수 있습니다 .pd.concat
df
pd.concat([c for _, c in df.items()], axis=1, keys=new)
x098 y765 z432
0 1 3 5
1 2 4 6
해결 방법 3
재구성. dtype
모든 열에 대해 단일이있는 경우에만 사용해야합니다 . 그렇지 않으면, 당신은 결국dtype
object
모든 열 다시 변환하려면 더 많은 사전 작업이 필요합니다.
단일 dtype
pd.DataFrame(df.values, df.index, new)
x098 y765 z432
0 1 3 5
1 2 4 6
혼합 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
해결 방법 4 and
의 특수 효과입니다 . 인덱스를 인라인으로 설정할 수 있지만 해당하는 것은 없습니다 . 따라서 다시 전치 한 다음 다시 전치 할 수 있습니다 . 그러나 동일한 단일 대 혼합transpose
set_index
pd.DataFrame.set_index
set_columns
set_index
dtype
dtype
솔루션 3 경고가 여기에 적용됩니다.
단일 dtype
df.T.set_index(np.asarray(new)).T
x098 y765 z432
0 1 3 5
1 2 4 6
혼합 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
솔루션 5 각 요소를 순환
하는 a lambda
를 사용합니다
.이 솔루션에서는 람다를 전달 하지만 무시합니다. 또한 걸리지 만 기대하지는 않습니다. 대신, 반복자가 기본값으로 제공되며 그 값이 무엇인지에 관계없이 한 번에 하나씩 순환하는 데 사용할 수 있습니다 .pd.DataFrame.rename
new
x
y
x
df.rename(columns=lambda x, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
그리고 파이썬 채팅 에서 사람들이 나에게 지적한 것처럼 and *
사이 에 in을 추가하면 변수를 보호 할 수 있습니다 . 그러나이 맥락에서 나는 그것이 보호가 필요하다고 생각하지 않습니다. 여전히 언급 할 가치가 있습니다.x
y
y
df.rename(columns=lambda x, *, y=iter(new): next(y))
x098 y765 z432
0 1 3 5
1 2 4 6
df.rename(lambda x : x.lstrip('$'),axis=1)
x
이 무시 한다고 말할 때 당신이 의미하는 바를 따르지 않습니까?
장면 뒤에서 일어나는 일에 대해 조금 설명하고 싶습니다.
데이터 프레임은 일련의 시리즈입니다.
차례로 시리즈는 numpy.array
numpy.array
의 재산이있다 .name
이것은 시리즈의 이름입니다. 팬더 가이 속성을 존중하는 것은 드물지만 장소에 머무르며 팬더 행동을 해킹하는 데 사용할 수 있습니다.
여기에 많은 답변이 df.columns
속성이 list
실제로 언제인지에 대해 이야기 합니다 Series
. 이는 .name
속성 이 있음을 의미 합니다.
이것은 열 이름을 채우기로 결정한 경우에 발생합니다 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
색인 이름은 항상 한 열 아래로 내려옵니다.
.name
속성은 때때로에 남아있다. 설정 df.columns = ['one', 'two']
하면가 df.one.name
됩니다 'one'
.
를 설정하면 df.one.name = 'three'
다음 df.columns
아직도 당신을 줄 것이다 ['one', 'two']
, 그리고df.one.name
당신에게 줄 것이다'three'
pd.DataFrame(df.one)
돌아올 것이다
three
0 1
1 2
2 3
팬더는 .name
이미 정의 된 의 를 재사용하기 때문 입니다 Series
.
팬더는 다중 계층 열 이름을 수행하는 방법이 있습니다. 너무 많은 마술이 포함되어 있지 않지만 여기에 사람이있는 것을 보지 못했기 때문에이 답변을 다루고 싶었습니다.
|one |
|one |two |
0 | 4 | 1 |
1 | 5 | 2 |
2 | 6 | 3 |
다음과 같이 열을 목록으로 설정하면 쉽게 달성 할 수 있습니다.
df.columns = [['one', 'one'], ['one', 'two']]
데이터 프레임이 있으면 df.columns는 모든 것을 목록으로 덤프하여 조작 한 다음 데이터 프레임에 열 이름으로 다시 할당합니다.
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
가장 좋은 방법은? IDK. 방법-네
질문에 대한 답변에서 제시된 모든 주요 기술을 평가하는 더 좋은 방법은 cProfile을 사용하여 메모리 및 실행 시간을 측정하는 것입니다. @kadee, @kaitlyn, & @eumiro는 가장 빠른 실행 시간을 가진 함수를 가졌습니다.이 함수는 너무 빠르지 만 모든 답에 대해 .000 초와 .001 초의 반올림을 비교합니다. 도덕 : 위의 대답은 '최상의'방법이 아닐 것입니다.
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)')
이것이 데이터 프레임이라고 가정 해 봅시다.
두 가지 방법을 사용하여 열의 이름을 바꿀 수 있습니다.
사용 dataframe.columns=[#list]
df.columns=['a','b','c','d','e']
이 방법의 한계는 하나의 열을 변경해야하는 경우 전체 열 목록을 전달해야한다는 것입니다. 또한이 방법은 색인 레이블에는 적용되지 않습니다. 예를 들어, 이것을 전달한 경우 :
df.columns = ['a','b','c','d']
오류가 발생합니다. 길이 불일치 : 예상 축에 5 개의 요소가 있고 새 값에 4 개의 요소가 있습니다.
또 다른 방법은 rename()
인덱스, 열 또는 행의 이름을 바꾸는 데 사용되는 Pandas 방법입니다.
df = df.rename(columns={'$a':'a'})
마찬가지로 행이나 열을 변경할 수 있습니다.
df = pd.DataFrame({'$a': [1], '$b': [1], '$c': [1], '$d': [1], '$e': [1]})
새 열 목록이 기존 열과 동일한 순서 인 경우 할당이 간단합니다.
new_cols = ['a', 'b', 'c', 'd', 'e']
df.columns = new_cols
>>> df
a b c d e
0 1 1 1 1 1
이전 열 이름을 새 열 이름으로 입력 한 사전이있는 경우 다음을 수행 할 수 있습니다.
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
목록 또는 사전 매핑이없는 경우 $
목록 이해를 통해 선행 기호를 제거 할 수 있습니다 .
df.columns = [col[1:] if col[0] == '$' else col for col in df]
lambda col: d[col]
당신이 통과 할 수 d.get
... 그래서 같을 것이다df.columns.map(d.get)
df.rename(index=str,columns={'A':'a','B':'b'})
https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.rename.html
작은 예제로 이름 바꾸기를 이해합시다 ...
1. 매핑을 사용하여 열 이름 바꾸기 :
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. 매핑을 사용하여 인덱스 / 행 이름 바꾸기 :
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
원래 열 레이블을 바꾸는 또 다른 방법은 원래 열 레이블에서 원하지 않는 문자 (여기서 '$')를 제거하는 것입니다.
이것은 df.columns에서 for 루프를 실행하고 제거 된 열을 df.columns에 추가하여 수행 할 수 있습니다.
대신 아래와 같이 목록 이해를 사용하여 단일 명령문으로 깔끔하게 수행 할 수 있습니다.
df.columns = [col.strip('$') for col in df.columns]
( strip
파이썬의 메소드는 문자열의 시작과 끝에서 주어진 문자를 제거합니다.)
나는이 질문과 대답이 죽었다는 것을 알고있다. 그러나 나는 내가 겪고있는 문제 중 하나에 대한 영감을 얻었습니다. 다른 답변의 비트와 조각을 사용하여 문제를 해결할 수 있었으므로 누구나 필요할 때 내 답변을 제공했습니다.
내 방법은 일반적 delimiters=
이며 변수 를 쉼표로 구분하여 미래에 대비 하여 추가 구분 기호를 추가 할 수 있습니다 .
근무 코드 :
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 ]
산출:
>>> 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
이 방법은 MultiIndex에는 작동하지 않습니다. 다중 인덱스의 경우 다음과 같은 작업을 수행해야합니다.
>>> 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
제어 시스템에서 제공 시스템에 의해 명명 된 많은 열을 처리 해야하는 경우 일반적인 접근 방식과 특정 대체 방법을 한 번에 조합 한 다음 접근 방식을 생각해 냈습니다.
먼저 정규식을 사용하여 데이터 프레임 열 이름에서 사전을 생성 한 다음 열 이름의 특정 부록을 버리고 수신 데이터베이스에서 나중에 예상되는대로 코어 열의 이름을 지정하기 위해 사전에 특정 대체를 추가하십시오.
그런 다음 한 번에 데이터 프레임에 적용됩니다.
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)
이미 제공된 솔루션 외에도 파일을 읽는 동안 모든 열을 바꿀 수 있습니다. 사용할 수 names
있고header=0
그렇게 할 수 있습니다.
먼저 열 이름으로 사용하려는 이름 목록을 만듭니다.
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)
이 경우 모든 열 이름이 목록에있는 이름으로 바뀝니다.
다음은 타이핑을 줄이는 데 사용하는 멋진 작은 기능입니다.
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
작동 방식의 예는 다음과 같습니다.
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')
정규식을 사용할 수 있다고 가정합니다. 이 솔루션은 정규식을 사용하여 수동 인코딩이 필요하지 않습니다.
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